在flash中用双向链表实现受控动画
2010-07-22 00:00:00 来源:WEB开发网虽然flash中对实现连续的动画有很好的支持, 但是在编写游戏的时候,这还远远不够好。
场景:你的英雄比怪物先一帧击中了对方,对方因为受到攻击原本准备法术的动作被停止了。这个时候下一帧不能继续播放准备法术/释放法术的动画了,而应该及时播放怪物被击中的动画。
游戏中这类场景是比较常见的,这就要求重新实现一个更好控制,更易改变的动画控制系统。
我决定自己实现一个动画调度器来控制所有的动画。这个调度器需要能在整个系统绘制新帧的时候做出合适响应。我采用的方式是监听系统的enterFrame事件,并且保留一个自系统开始以来frame计数。按FPS=60计算,使用uint型能在数十天内良好运行,考虑到游戏规模,这个时间已经足够长了 ^-^
1 public class AnimationDispatcher{
2 //帧数统计
3 private var _frameCounter : uint;
4
5 public function listenEnterFrame(e:Event):void{
6 _frameCounter++;
7 }
8 }
接下来实现被控制的动画。
01 public interface IActionFrame{
02
03 //下一次需要执行的帧数
04 function get nextActionFrame():uint;
05
06 //执行动作
07 function doAction():void;
08
09 //执行完doAction后是否需要把对象重新放回list中
10 function needToPushBack():Boolean;
11 }
链表的节点:
01 internal class ListNode{
02 private var _previous : ListNode;
03 private var _next : ListNode;
04 private var _item : IActionFrame;
05
06 public function ListNode(item:IActionFrame){
07 _item = item;
08 }
09
10 public function get previous():ListNode{
11 return _previous;
12 }
13
14 public function set previous(value:ListNode){
15 _previous = value;
16 }
17
18 public function get next():ListNode{
19 return _next;
20 }
21 public function set next(value:ListNode):void{
22 _next = value;
23 }
24 public function get item():IActionFrame{
25 return _item;
26 }
27 }
- ››FLASH不等于运算符!=的使用实例
- ››FLASH不全等运算符!==
- ››FLASH字符串分隔符运算符
- ››FLASH% 模运算符
- ››Flash+、++、+= 加法运算符
- ››Flash, 逗号运算符
- ››flash中的-、--、-=减法运算符
- ››Flash的-Infinity 常数、.点运算符、/ 除法运算符...
- ››Flash两种注释方法/*..*/ 和// 注释行分隔符运算符...
- ››Flash的/=除法赋值运算符、=赋值运算符、== 等于运...
- ››Flash之?: 条件运算符、^ 按位 XOR 运算符、^= 按...
- ››Flash的_framesloaded代码示例
更多精彩
赞助商链接