zoukankan      html  css  js  c++  java
  • 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里写好再贴过来。
      
  • 相关阅读:
    [扩展推荐] Laravel 中利用 GeoIP 获取用户地理位置信息
    10 个优质的 Laravel 扩展推荐
    5 个非常有用的 Laravel Blade 指令,你用过哪些?
    PHP 7.3 我们将迎来灵活的 heredoc 和 nowdoc 句法结构
    使用 Swoole 来加速你的 Laravel 应用
    一个成功的 Git 分支模型(适用于商业应用开发)
    github搜索语法
    python协程爬虫-aiohttp+aiomultiprocess使用
    python-协程、多线程、多进程性能比较
    functools模块-为函数预设args/kwargs参数
  • 原文地址:https://www.cnblogs.com/pains/p/1246146.html
Copyright © 2011-2022 走看看