• AS3人物行走控制(角色基类)


    物素材:
    人物素材

    运行效果:

    搞了两天,终于搞定了,其中参考了网上关于角色图象处理的帖子,不过原文是4面的,而且靠键盘来控制,我写的是8面的,通过鼠标来控制,比较适合做FLASH的在线社区类游戏。通过对以上图片进行处理,最终响应鼠标动作,而形成角色走动。角色引擎代码如下:

    1. package com.d5power
    2. {
    3.     import flash.display.Bitmap;
    4.     import flash.display.BitmapData;
    5.     import flash.display.Loader;
    6.     import flash.display.Sprite;
    7.     import flash.events.Event;
    8.     import flash.events.IOErrorEvent;
    9.     import flash.events.TimerEvent;
    10.     import flash.geom.Point;
    11.     import flash.geom.Rectangle;
    12.     import flash.net.URLRequest;
    13.     import flash.utils.Timer;
    14.    
    15.     import mx.controls.Alert;
    16.    
    17.     public class D5Player extends Sprite
    18.     {
    19.         /**
    20.          * 构造函数
    21.          * 输入内容包括以下:
    22.          * @param playerDoc:角色素材
    23.          * @param 角色的基本宽度
    24.          * @param height:角色的基本高度
    25.          */
    26.         public function D5Player(playerDoc:String,width:uint,height:uint):void
    27.         {
    28.             // 初始化
    29.             myWidth=width;
    30.             myHeight=height;
    31.             myStep=0;
    32.             myDirection=0;
    33.             mySpeed=5;
    34.            
    35.             myTimer=new Timer(100);
    36.             myTimer.addEventListener(TimerEvent.TIMER,drawPlayer);
    37.  
    38.             myLoader=new Loader();
    39.             myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,makePlayerMaps);
    40.             myLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandle);
    41.             myLoader.load(new URLRequest(playerDoc));
    42.            
    43.  
    44.         }
    45.         /**
    46.          * 生成初始图象
    47.          * @param d 初始状态的方向
    48.          */
    49.         public function Display(d:uint,p:uint=99):void
    50.         {
    51.             // 清空MAP
    52.             if(map!=null)
    53.             {
    54.                 this.removeChild(map);
    55.             }
    56.             pointer= p==99 ? pointer : p;
    57.             map=new Bitmap(maps[d][pointer]);
    58.             this.addChild(map);
    59.         }
    60.        
    61.         /**
    62.          * 控制角色移动到特定的位置
    63.          * 在移动的过程中,根据角色的坐标来判断其正确的方向
    64.          * @param x 目标位置的X坐标
    65.          * @param y 目标位置的Y坐标
    66.          */
    67.         public function moveto(x:int,y:int):void
    68.         {
    69.             // 计算真实距离
    70.             // 以模拟注册点在脚下
    71.             targetX=x-myWidth*0.5;
    72.             targetY=y-myHeight;
    73.             this.run();
    74.         }
    75.        
    76.         /**
    77.          * 设置角色方向
    78.          * $param d 想要设置的角色方向
    79.          */
    80.         public function set direction(d:uint):void
    81.         {
    82.             myDirection=d;
    83.         }
    84.         /**
    85.          * 读取IO错误
    86.          */
    87.         public function ioErrorHandle(e:IOErrorEvent):void
    88.         {
    89.             Alert("IOErrorEvent");
    90.         }
    91.        
    92.         /**
    93.          * 调试函数,返回调试信息
    94.          */
    95.         public function getDebuger():String
    96.         {
    97.             return myDebuger;
    98.         }
    99.        
    100.         /**
    101.          * 运行
    102.          */
    103.         private function run():void
    104.         {
    105.             myTimer.start();
    106.         }
    107.         /**
    108.          * 停止
    109.          */
    110.         private function stop():void
    111.         {
    112.             // 将角色设置在当前方向的第一帧
    113.             Display(myDirection,0);
    114.             myTimer.stop();
    115.         }
    116.        
    117.         /**
    118.          * 绘制角色
    119.          * 从数组中读取特定方向各动作,并循环显示形成动画
    120.          */       
    121.         private function drawPlayer(e:TimerEvent):void
    122.         {
    123.             movePlayer();
    124.             // 清空MAP
    125.             if(map!=null)
    126.             {
    127.                 this.removeChild(map);
    128.             }
    129.             // 获取新的角色图象
    130.             map=new Bitmap(maps[myDirection][pointer]);
    131.             this.addChild(map);
    132.             // 循环控制
    133.             if(pointer<myStep-1)
    134.             {
    135.                 pointer++;
    136.             }else{
    137.                 pointer=0;
    138.             }
    139.         }
    140.        
    141.         /**
    142.          * 角色移动控制
    143.          */
    144.        
    145.         private function movePlayer():void
    146.         {
    147.             var xdirection:int;
    148.             if(Math.abs(targetX-x)>mySpeed)
    149.             {
    150.                 xdirection=(targetX-x)>0 ? 1 : -1;
    151.                 x+=mySpeed*xdirection;
    152.             }else{
    153.                 x=targetX;
    154.                 xdirection=0;
    155.             }
    156.            
    157.             var ydirection:int;
    158.             if(Math.abs(targetY-y)>mySpeed)
    159.             {
    160.                 ydirection=(targetY-y)>0 ? 1 : -1;
    161.                 y+=mySpeed*ydirection;
    162.             }else{
    163.                 y=targetY;
    164.                 ydirection=0;
    165.             }
    166.             myDebuger=xdirection+":"+ydirection;
    167.             // 设置方向
    168.             switch(xdirection)
    169.             {
    170.                 case 1:
    171.                     switch(ydirection)
    172.                     {
    173.                         case 0: this.direction=2; break;
    174.                         case 1: this.direction=5; break;
    175.                         case -1: this.direction=7; break;
    176.                         default:break;
    177.                     }
    178.                     break;
    179.                 case -1:
    180.                     switch(ydirection)
    181.                     {
    182.                         case 0: this.direction=1; break;
    183.                         case 1: this.direction=4; break;
    184.                         case -1: this.direction=6; break;
    185.                         default:break;
    186.                     }
    187.                     break;
    188.                
    189.                 case 0:
    190.                     switch(ydirection)
    191.                     {
    192.                         case 0: stop(); break;
    193.                         case 1: this.direction=0; break;
    194.                         case -1: this.direction=3; break;
    195.                         default:break;
    196.                     }
    197.                     break;
    198.                 default:break;
    199.             }
    200.         }
    201.        
    202.         /**
    203.          * 角色初始化
    204.          * 将角色各方向各动作加入数组中
    205.          */
    206.        
    207.         private function makePlayerMaps(e:Event):void
    208.         {
    209.             var bitmap_temp:BitmapData=new BitmapData(myLoader.width,myLoader.height,true,0x00FFFFFF);
    210.             bitmap_temp.draw(myLoader);
    211.            
    212.             // 计算步数
    213.             myStep=Math.floor(myLoader.width/myWidth);
    214.            
    215.             for(var i:uint=0;i<Math.floor(myLoader.height/myHeight);i++)
    216.             {
    217.                 var arr:Array=new Array();
    218.                 for(var m:uint=0;m<myStep;m++)
    219.                 {
    220.                     var bmp_t:BitmapData=new BitmapData(myWidth,myHeight,true,0x00FFFFFF);
    221.                     bmp_t.copyPixels(bitmap_temp,new Rectangle(myWidth*m,myHeight*i,myWidth,myHeight),new Point(0,0));
    222.                     arr.push(bmp_t);
    223.                 }
    224.                 maps.push(arr);
    225.             }
    226.            
    227.             // 释放资源
    228.             bitmap_temp.dispose();
    229.         }
    230.        
    231.         /**@private */
    232.         private var maps:Array=new Array();                    // 角色资料数组
    233.         private var map:Bitmap;                                // 显示用对象,将通过不段刷新本对象来显示动画效果
    234.         private var myDirection:uint;                        // 方向控制
    235.         private var myLoader:Loader;                        // 素材加载用Loader对象
    236.         private var myTimer:Timer;                            // 计时器,用来控制动画效果
    237.         private var myWidth:uint;                            // 角色默认宽度
    238.         private var myHeight:uint;                            // 角色默认高度
    239.         private var myStep:uint;                            // 总步数
    240.         private var pointer:uint;                            // 当前步数
    241.         private var myDebuger:String = new String();
    242.        
    243.         /**@private */
    244.         private var targetX:int;                            // 移动的目标位置X
    245.         private var targetY:int;                            // 移动的目标位置Y
    246.         private var mySpeed:int;                            // 移动速度       
    247.        
    248.     }
    249. }
  • 相关阅读:
    java位运算
    AmCharts realtime flush example //add by liuwei 20120929
    配置Linux—LVS (DR)
    LVS(Linux Virtual Server) 学习笔记
    一个由sizeof引出的有意思的问题
    关于IsDebuggerPresent
    我的第一个python程序
    听Robert C. Richardson的报告会很失望
    杯具了,为啥不去tencent的实习生招聘呢
    通过信号量机制解决生产者消费者问题的模拟程序
  • 原文地址:https://www.cnblogs.com/chinatefl/p/1218199.html
Copyright © 2020-2023  润新知