使用FLEX和Actionscript开发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,copyToBackBuffer和setupCollision。
在enterFrame函数里AnimatedGameObject保留了一个轨迹来保存上一帧被演示后过了多久时间。一旦这个时间超过了在GraphicsResource中fps定义的值AnimatedGameObject就移到下一帧。这里也有一个playOnce属性,如果设置为真那么一个完整的动画被显示后将触发AnimatedGameObject来移除自身。这对于生成特效(比如爆炸)是很有用的,因为显示一次就消失了。它将让你作为一个编码者能在游戏中生成一种初始化后就不用干预的对象来清除它自身。
copyToBackBuffer仅仅在GameObject类的同一代码上做了小小的改动来让它仅仅拷贝graphics属性引用的图形的一部分。这部分同当前的帧有关系,是当我们在屏幕上演示一个动画时从左到右的显示的一帧。
最后我们覆盖了setupCollision函数来定义collisionArea,它是动画中一帧的大小,而不是整个图片的大小。
这里其余的代码(比如资源池和开始/结束函数)在前面章节已经讨论过,它们在此处的应用还是一样。
我们也需要给ResourceManager做些改变来适应动画需要的特别的信息。现在让我们看看它的代码。
<Previous Page | page: 1 2 3 4 | Next Page>