AS3实现RPG游戏鼠标8方向操作
2008-06-24 12:29
155 查看
在宝宝姐的提醒下为地图引擎添加了鼠标操作的支持。现在既可以用键盘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方向控制
为了避免不必要的混乱,键盘和鼠标不能同时控制人物移动。先新增两个布尔值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方向控制
相关文章推荐
- [脚本]实现游戏对象跟随鼠标方向移动
- [unity3d]如何实现游戏对象跟随鼠标方向移动
- 实现DX游戏的键盘鼠标操作
- [unity3d]如何实现游戏对象跟随鼠标方向移动
- [脚本]实现游戏对象跟随鼠标方向移动
- [脚本]实现游戏对象跟随鼠标方向移动
- JavaScript实现的水果忍者游戏,支持鼠标操作
- 《游戏脚本的设计与开发》-(RPG部分)3.3 加入多个人物以及对话实现
- 一种通过鼠标操作实现多边形的绘制的实现方法
- C语言实现贪吃蛇(四)----游戏存档读档(文件操作)
- 键盘操作代替鼠标,实现WordPress翻页
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- java速度入四.文件的基本操作及猜数字游戏的实现
- 【转】C# WinForm中Panel实现用鼠标操作滚动条
- 游手好学教程 – AS3游戏小地图的实现 MiniMap类
- Python使用pyautogui模块实现自动化鼠标和键盘操作示例
- [Unity&RPG]实现简单的鼠标点击移动 角色
- Silverlight C# 游戏开发:方向键的组合,八方向实现
- unity3d模仿魔兽世界鼠标对游戏操作
- WM_LBUTTONDOW实现地图不断往鼠标方向移动位置