渡口

Flash AS3

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

原文链接: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)设计模式吗?

posted on 2011-06-20 10:10  BlueJack  阅读(985)  评论(0)    收藏  举报