ActionScript3使用角度值控制游戏角色的动作和移动

游戏中的角色会有多个方向的动作,以及朝不同的方向移动,有四个方向的也有八个方向的,以前我用单词来表示这个方向,如:leftrightupdown,然后用switch来决定执行哪些代码以完成相应的动作。

一直以来我都觉得这样做太差了,代码会很多,更是相似的代码重复写,后来我想到了数学中的极坐标,我们把原来保存leftrightupdown的变量改为保存一个角度值,0°、90°、180°、270°,当然度数单位就不要了,这样一来就可以用正弦函数和余弦函数来确定xy的加减值。

  • 利用反射确定角色动作
我给各个角色动作的类命名格式为:[角色动作名]+”_”+[角度值],比如:walk_90即向上走的动作(基类为MovieClip),现在就是要根据字符串转换成类型来定义变量,在包flash.utils下有个getDefinitionByName函数(使用时要跟用类一样import flash.utils.getDefinitionByName;AS3中函数也是一种类型即Function,类就是Class的类型,下面会用Class来定义类)。
var Act:Class = getDefinitionByName(“Walk_”+角度值) as Class;
var a:MovieClip = new Act();
addChild(a);
  • 使用正弦余弦
有个角度值就可以不用switch了,按上面说的向右为0度那么代码就可以这样写了
mActor.x += mSpeed * Math.cos(角度值);
mActor.y 
-= mSpeed * Math.sin(角度值);
  • 角色管理
这里有个问题,就是每当更改动作时都要移除当前的角色,然后再添加,这样添加后角色的坐标值就变为(0,0)了,为了不用移除前要把坐标值保存下来而后又在添加后重新设置角色的坐标我想到了这样做:在场景中定义一个Sprite的mActor表示角色,每次不移除它,而是移除mActor里的MovieClip对象即各个动作,添加也是给mActor添加各个动作的MovieClip对象。
综合上面大致代码是这样:
mActor.removeChildAt(0);
var Act:Class = getDefinitionByName(“Walk_”+角度值) as Class;
var a:MovieClip = new Act();
mActor.addChild(a);
mActor.x 
+= mSpeed * Math.cos(角度值);
mActor.y 
-= mSpeed * Math.sin(角度值);


PS:上午写了一半,突然停电了,郁闷,后来改在word里写好再贴过来。
  
原文地址:https://www.cnblogs.com/pains/p/1246146.html