StarlingManual:显示对象

来自Starling中文站
跳转到: 导航, 搜索

显示对象

Flash的视觉基本组成部分是显示列表,它描述了屏幕中哪里绘制对象,以及如何绘制对象,Starling仿照了显示列表的模式,其框架中大量的类与函数与flash原生API都非常相似。

所有的显示对象基类都是DisplayObject。Quad类是继承自DisplayObject,Starling中的其他类也是如此,比如Image.textField等等。

下面这幅图是Starling框架中对象的类层次结构:

Class hierarchy.png

如果我们无需使用事件机制(后面会讲到),那么我们的顶层可以是DisplayObject类。正如前面说的一样,一切在舞台中显示的类对象其基类都是DisplayObject。当然DisplayObject是一个抽象了,你不可以直接实例化它,但是他提供了所有显示对象最基础的方法和属性

  • position (x, y)
  • size (width, height)
  • scale factor (scaleX, scaleY)
  • rotation
  • opacity (alpha)
  • etc.

如果你看到了DisplayObject这个类,你可以找到它的几个子类,如Quad,Image,TextField,Button和MovieClip。这些类的功能通过名称应该可以很清楚的知道它们都是做什么的了。

另外一个抽象类就是DisplayObjectContainer了。顾名思义,它是一个显示对象容器类,我们可以使用它来组织逻辑系统,并形成显示树。

显示树

很多时候你都需要扩展一些基本的类来创建更加复杂的对象。比如再图片中写入一些文字等等。当你将图像移动,那么文字也需要跟随它移动。同样的一些放大或者缩小操作,旋转和透明度的变化都需要进行处理。所以要将两个对象当作一个对象来看待。

所以,你需要使用DisplayObjectContainer或者Sprite。这些类大同小异,唯一的区别是DisplayObjectContainer是一个抽象类。

所以,我们将image和text组合再一起,让他们成为一个Sprite的子显示对象:

var sprite:Sprite = new Sprite();
var image:Image = new Image(texture);
var textField:TextField = new TextField(200, 50, "Hello World");
sprite.addChild(image);
sprite.addChild(textField);

我们先将image添加到sprite中,然后再添加textfiel。这样他们的显示顺序怎么后面的覆盖在顶部。

现在sprite有两个子显示对象,并且控制它会同时控制image和textfield。

// query the number of children
var numChildren:int = sprite.numChildren; // -> 2
// move everything 50 pixels to the right
sprite.x += 50; 
// 'width' and 'height' take into account the sizes and
// positions of the children:
var totalWidth:Number = sprite.width;
// rotate by 90 degrees (Starling expects radians)
sprite.rotation = deg2rad(90)

每一个显示对象都拥有自己的坐标系。比如你将图钉扎到一张纸片上。那么我们就有了系统坐标系和场景坐标系。

Coordinate systems.png

现在,当你旋转你的纸片,那么它将改变他的XY轴。但是坐标系统的根坐标系却始终保持不变。

相对于父坐标系(木板)图钉的位置代表坐标系的XY点。 牢记这个比喻,因为当你使用Starling框架时候,我们需要时常去关注这个非常重要的东西。 DisplayObjectContainer默认的很多方法来帮助我们处理子显示对象:

function addChild(child:DisplayObject):void;
function addChildAt(child:DisplayObject, index:int):void;
function contains(child:DisplayObject):Boolean;
function getChildAt(index:int):DisplayObject;
function getChildIndex(child:DisplayObject):int;
function removeChild(child:DisplayObject, dispose:Boolean=false):void;
function removeChildAt(index:int, dispose:Boolean=false):void;
function swapChildren(child1:DisplayObject, child2:DisplayObject):void;
function swapChildrenAt(index1:int, index2:int):void;

创建自定义显示对象

当你开始制作一个游戏的时候,你需要把它分解为多个逻辑模块。一个简单的国际象棋游戏可能棋盘,棋子,一个暂停按钮按一个消息提示框。所有的元素都将会显示在你的游戏场景中,这个时候你就需要从DisplayObject扩展你自己的显示类了。

下面是一个消息提示框的例子:

Msgbox.png

这个消息提示框有一个背景,图标,文字和两个按钮。最终你要将MessageBox类中的细节代码隐藏起来。

现在,创建一个名为MsgBox的类,并继承自Sprite。然后再他的构造器函数中初始化这个消息提示框:

public class MsgBox extends Sprite
{
    [Embed(source = "background.png")]
    private static const Background:Class;
 
    [Embed(source = "button_bg.png")]
    private static const ButtonBG:Class;
 
    public function MsgBox(text:String)
    {
        var background:Image = Image.fromBitmap(new Background());
        var textField:TextField = new TextField(100, 20, text);
 
        var buttonTexture:Texture = Texture.fromBitmap(new ButtonBG());
        var yesButton:Button = new Button(buttonTexture, "yes");
        var noButton:Button  = new Button(buttonTexture, "no");
 
        yesButton.x = 10;
        yesButton.y = 20;
 
        noButton.x = 60;
        noButton.y = 20;
 
        addChild(background);
        addChild(textField);
        addChild(yesButton);
        addChild(noButton);
    }
}

现在你已经拥有了一个消息提示框组件。要想使用它,只要创建一个MsgBox实列然后加到你的显示列表中:

var msgBox:MsgBox = new MsgBox("Really exit?");
addChild(msgBox);

现在你可以添加一些其他的功能(比如淡入淡出),并且你需要捕获用户点击按钮的动作!这就使用到了Starling框架的消息事件机制,后面的章节中会告诉你如何去做的!

翻译:张鑫磊(mebius.ashan)

个人工具
名字空间

变换
操作
导航
Starling中文资料
Starling原创教程
论坛
友链
工具箱