白桦的天空

第一次的心动,永远的心痛!
  首页  :: 新随笔  :: 联系 :: 管理

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

Posted on 2008-06-12 10:57  白桦的天空  阅读(1756)  评论(2编辑  收藏  举报
物素材:
人物素材

运行效果:

搞了两天,终于搞定了,其中参考了网上关于角色图象处理的帖子,不过原文是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 width:角色的基本宽度
  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. }