使用FLEX和 Actionscript 开发FLASH游戏(七)-2

使用FLEXActionscript开发FLASH 游戏-位图动画(第二页)

AnimatedGameObject.as

package

{

       import flash.display.*;

       import flash.geom.*;

       import mx.collections.*;

 

       public class AnimatedGameObject extends GameObject

       {

              static public var pool:ResourcePool = new ResourcePool(NewAnimatedGameObject);

              protected var frameTime:Number = 0;

              protected var currentFrame:int = 0;

              protected var frameWidth:int = 0;

              protected var playOnce:Boolean = false;

             

              static public function NewAnimatedGameObject():AnimatedGameObject

              {

                     return new     AnimatedGameObject();

              }

                           

              public function AnimatedGameObject()

              {

                                         

              }

             

              public function startupAnimatedGameObject(graphics:GraphicsResource, position:Point, z:int = 0, playOnce:Boolean = false):void

              {                  

                     this.playOnce = playOnce;                  

                     this.frameWidth = graphics.bitmap.width / graphics.frames;

                    

                     startupGameObject(graphics, position, z);

              }

             

              override public function enterFrame(dt:Number):void

              {

                     if (inuse)

                     {

                            frameTime += dt;

                            if (graphics.fps != -1)

                            {

                                   while (frameTime > 1/graphics.fps)

                                   {

                                          frameTime -= 1/graphics.fps;

                                          currentFrame = (currentFrame + 1) % graphics.frames;

                                          if (currentFrame == 0 && playOnce)

                                          {

                                                 shutdown();

                                                 break;

                                          }

                                   }

                            }

                     }

              }

             

              override public function copyToBackBuffer(db:BitmapData):void

              {

                     if (inuse)

                     {

                            var drawRect:Rectangle = new Rectangle(currentFrame * frameWidth, 0, frameWidth, graphics.bitmap.height);

                            db.copyPixels(graphics.bitmap, drawRect, position, graphics.bitmapAlpha, new Point(drawRect.x, 0), true);

                     }

              }

             

              override protected function setupCollision():void

              {

                     collisionArea = new Rectangle(0, 0, frameWidth, graphics.bitmap.height);

              }

       }

      

}

   就像其它任何游戏资源一样,AnimatedGameObject类是从GameObject类继承来的。为了显示一个动画我们覆盖了GameObjects类的三种函数:enterFrame,copyToBackBuffersetupCollision

   enterFrame函数里AnimatedGameObject保留了一个轨迹来保存上一帧被演示后过了多久时间。一旦这个时间超过了在GraphicsResourcefps定义的值AnimatedGameObject就移到下一帧。这里也有一个playOnce属性,如果设置为真那么一个完整的动画被显示后将触发AnimatedGameObject来移除自身。这对于生成特效(比如爆炸)是很有用的,因为显示一次就消失了。它将让你作为一个编码者能在游戏中生成一种初始化后就不用干预的对象来清除它自身。

   copyToBackBuffer仅仅在GameObject类的同一代码上做了小小的改动来让它仅仅拷贝graphics属性引用的图形的一部分。这部分同当前的帧有关系,是当我们在屏幕上演示一个动画时从左到右的显示的一帧。

   最后我们覆盖了setupCollision函数来定义collisionArea,它是动画中一帧的大小,而不是整个图片的大小。

   这里其余的代码(比如资源池和开始/结束函数)在前面章节已经讨论过,它们在此处的应用还是一样。

   我们也需要给ResourceManager做些改变来适应动画需要的特别的信息。现在让我们看看它的代码。

<Previous Page | page: 1 2 3 4 | Next Page>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值