白桦的天空

第一次的心动,永远的心痛!
posts - 314, comments - 202, trackbacks - 1, articles - 16
  首页  :: 新随笔  :: 联系 :: 管理

AS3实现RPG游戏鼠标8方向操作

Posted on 2008-06-24 12:29 白桦的天空 阅读(...) 评论(...) 编辑 收藏
在宝宝姐的提醒下为地图引擎添加了鼠标操作的支持。现在既可以用键盘ASDW也可以用鼠标实现人物的8方向运动了。 ^-^

为了避免不必要的混乱,键盘和鼠标不能同时控制人物移动。先新增两个布尔值mouse和keyboard,分别代表当前是否被鼠标/键盘控制。若其中一个为真,则另一个输入设备不被响应。

下面是鼠标控制移动的逻辑。

先来对舞台进行一下划分,如下图:




相对于舞台上的人物而言,若鼠标在它的任一方向被按下,人物则改为向该方向移动;若鼠标在保持按下的情况下移动到另外一个区域,则人物的运动方向也随之更改;若鼠标弹起则停止运动。

根据之前的键盘8方向程序,人物的运动方向由一个数组dirArr来表示,这个数组保存着当前键盘上被按下的键的keyCode。如果有新键按下或旧键弹起,则更新这个数组,并调用setDir函数适当更改人物的运动方向。

这样一来要添加鼠标支持就非常简单了。让stage分别侦听MouseEvent.MOUSE_DOWN,MouseEvent.MOUSE_UP, MouseEvent.MOUSE_MOVE事件,并交由onMouseDir函数处理。当鼠标按下,先分析它相对于人物的位置(稍后介绍),然后根据位置将代表该方向的keyCode push进dirArr数组。当鼠标弹起,直接清空dirArr数组。若按下时有移动,先分析相对位置是否有变化,没有就什么都不做,有的话先清空dirArr数组,再把新的方向push进去。这3种情况最后都调用一下setDir函数更新人物运动方向就好了。

相对位置的分析如下。

这里要借助三角函数来判断鼠标当前相对于人物的方向,也就是要求出下图中角a的值。




Flash的坐标系和常用的直角坐标系稍有不同,它的y轴正方向是向下的,这里要稍微注意一下。要计算角a,先求出两直角边nx、ny以及斜边r,然后求余弦cos(a) = nx / r,最后求反余弦并取整。取整是为了节省运算,整数运算相对于浮点运算要快得多,这在有大量运算时尤为突出。另外需要注意的是当鼠标位于x轴之上时,角a会大于180度,而反三角函数只给出0~180的解,所以需要做一个转换:a = 360 - a。详细计算代码如下:

var nx:Number=mouseX-man.x;
var ny:Number=mouseY-man.y;
var r:Number=Math.sqrt(nx*nx+ny*ny);
var cos:Number=nx/r;
var angle:int=int(Math.floor(Math.acos(cos)*180/Math.PI));


if(ny<0){

    angle=360-angle;
}


之后switch变量angle的值,push相应的keyCode:

var msArr:Array=new Array();

if(angle>337 || angle<23){
    msArr.push(68);
} else if(angle>292){
    msArr.push(68);
    msArr.push(87);
} else if(angle>247){
    msArr.push(87);
} else if(angle>202){
    msArr.push(87);
    msArr.push(65);
} else if(angle>157){
    msArr.push(65);
} else if(angle>112){
    msArr.push(65);
    msArr.push(83);
} else if(angle>67){
    msArr.push(83);
} else{
    msArr.push(83);
    msArr.push(68);
}


最后调用setDir函数就完成了。详细的代码参见源文件dirCtr.fla中onMouseEvent函数和parseMouseDir函数。希望对有兴趣的朋友有帮助。 ^-^

另有源文件PPCD.fla是perfectPixelCollisionDetection(精确到像素的任意不规则形状的碰撞检测)类的定义,Dir2.fla是舞台上走动的人物的定义,要正确运行需要这些代码,我人懒没特意分离出去,不好意思啦,不必理会它们。 ^-^


SWF效果:
[flash]http://uploadingit.com/files/480871_xzu7b/TestMapMouse.swf[/flash]
下载:http://uploadingit.com/files/480871_xzu7b/TestMapMouse.swf


源文件下载:http://uploadingit.com/files/480923_adhrb/mouse8dir.zip

源文件中关于键盘8方向移动参见原帖:【分享01】AS3实现RPG游戏8方向控制