原文链接:http://www.brighthub.com/hubfolio/matthew-casperson/articles/73730.aspx
PushButton中的基本组成元素叫Entity(实体),或者是实现了IEntity接口。一个Entity可以代表任何东西:玩家、敌人、子弹、钥匙,等等...
一般来说,Entity只是一个空壳,本身不实现具体的功能。要让它具有某项功能,比如绘制图形、移动人物、管理会话等等,就要创建相关的Component(组件),并把它装入Entity。比方说如果Entity是个汽车外壳,起码要给它装入2个组件(Component),引擎和轮子,汽车才能移动。也就是说,Entity的任务就是把一系列的Component(组件)包装起来,而具体的功能,由Component去实现。
当你开始使用PBE后,你可能做的最多的事就是创建各种功能组件(Component),把它们用Entity包装起来以定义一个新物体,并最终用这些自定义的物体组成我们的游戏。
下面,我就用PBE自带的组件(Component)来创建一个简单的Entity。
package
{
import com.pblabs.engine.entity.IEntity;
import com.pblabs.engine.entity.PropertyReference;
import com.pblabs.engine.PBE;
import com.pblabs.rendering2D.SimpleShapeRenderer;
import com.pblabs.rendering2D.SimpleSpatialComponent;
import com.pblabs.rendering2D.ui.SceneView;
import flash.geom.Point;import flash.display.Sprite;
[SWF(width="480", height="384", backgroundColor="0x7F92FF")]
public class Main extends Sprite
{public function Main() {// 初始化引擎PBE.startup(this);//SceneView类渲染场景,默认为舞台(stage)大小var sv:SceneView = new SceneView();PBE.initializeScene(sv);//创建实体this.createEntity();}//我们用这个函数创建一个新实体(Entity)private function createEntity():void {/*allocateEntity()函数用来创建一个空的Entity官方说明中建议要用IEntity接口,而不是直接使用Entity类 */var entity:IEntity = PBE.allocateEntity();
/* SimpleSpatialComponent是PBE自带的组件,它定义了位置(position)、
大小(size)、旋转(rotation)、速率(velocity)和角速度(angular velocity),
把它装入我们的entity,以保存entity在屏幕上的坐标、大小等属性 */
var spatial:SimpleSpatialComponent = new SimpleSpatialComponent();
//一定要为它指定“管理者”:spatialManager
spatial.spatialManager = PBE.spatialManager;
//这里我们只为它定义位置和大小
spatial.position = new Point(0,0);
spatial.size = new Point(200,50);
//最后,把它装入到我们的entity,并命名为"Spatial"
entity.addComponent( spatial, "Spatial" );
/*下面我们创建一个渲染器:SimpleShapeRenderer组件,也是PBE自带的。
使用它能够很简单的在屏幕上绘制一个正方形或正圆形 */
var render:SimpleShapeRenderer = new SimpleShapeRenderer();
//把它的scene属性设为PBE.scene,它就会被加入我们初始化好的PBE场景中
render.scene = PBE.scene;
//是圆形还是方形,二者只能取其一
render.isCircle = true;
render.isSquare = false;
//radius属性定义图形的半宽(方形)或半径(圆形),这里我们不用设置它,
//因为图形的大小是根据上面"Spatial"组件的size属性控制的
//render.radius = 25;
//设定线条宽度、线条颜色和填充颜色
render.lineSize = 2;
render.lineColor = 0x000000;
render.fillColor = 0x0000FF0;
//在PBE中,我们用"@Spatial.position"这样的形式引用名为"Spatial"的组件
//的position属性,如下所示。这样,当我们改变"Spatial"组件的position和
//size等属性时,render会自动根据新属性重绘。
render.positionProperty = new PropertyReference("@Spatial.position");
render.rotationProperty = new PropertyReference("@Spatial.rotation");
render.sizeProperty = new PropertyReference("@Spatial.size");
//把渲染器命名为"Render",加入我们的entity
entity.addComponent( render, "Render" );
//initialize函数把entity命名为"MyEntity"并加入到PBE中。
entity.initialize("MyEntity","Items");
}}
}
|
编译运行,会在窗口中显示一个椭圆。上面提到了,SimpleShapeRenderer组件只能绘制正方形或正圆形,为什么出来的是椭圆呢?看这里:spatial.size = new Point(200,50),然后,我们又把"Render"的size属性链接到了上面:render.sizeProperty = new PropertyReference("@Spatial.size")。所以render就绘制了200X50的椭圆了。 注意,想引用同一实体(Entity)中组件(Component)的属性,要用"@" 符号,后面跟着组件的注册名,最后用"."取属性。比如想引用Ai.targets[0].x,这样写:new PropertyReference("@Ai.targets.0.x")。引用其它实体(Entity)中组件(Component)的属性,要用"#" 符号,后面跟着实体的注册名。比如实体"Level"中有个"Timer"组件,要取它的timeLeft属性:new PropertyReference("#Level.Timer.timeLeft")。而要引用XML模板(以后的教程中会介绍)中的属性,要用"!" 符号。比如取"Enemy"模板中"Life"组件的health属性:new PropertyReference("!Enemy.Life.health")。 好了,这节课我们创建了自己的第一个实体(Entity),而Entity是我们将来游戏中的最基本的组成元素。这次的例子中,"MyEntity"包含了2个组件,"Spatial"和"Render"。"Spatial"保存了一组空间关系的数据:位置、大小、速度等等。"Render"则负责在屏幕上绘制图形。随着今后学习的深入,你会发现,如果再加上一个"Controller",就成为了最最典型、最最常用的一种Entity结构:Spatial-Render-Controller。Controller可以是键盘输入接收器,或是具有人工智能的程序,它可以改变Spatial中的部分或全部属性。而这些变化随即又会被Render反映出来。看到这里,您想到了什么?这不就是MVC(Model-View-Controller)设计模式吗? |

浙公网安备 33010602011771号