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


    在宝宝姐的提醒下为地图引擎添加了鼠标操作的支持。现在既可以用键盘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方向控制
  • 相关阅读:
    W3C规范
    背景图片调整大小
    comfirm和prompt的区别
    position属性absolute与relative 的区别
    text-decoration和text-indent和text-shadow
    刷新网页跳转锚点
    安卓中location.href或者location.reload 不起作用
    $_SERVER 当前信息
    堆+思维——cf1330E
    树形dp——cf1332F【好题】
  • 原文地址:https://www.cnblogs.com/chinatefl/p/1228849.html
Copyright © 2020-2023  润新知