运行效果:
搞了两天,终于搞定了,其中参考了网上关于角色图象处理的帖子,不过原文是4面的,而且靠键盘来控制,我写的是8面的,通过鼠标来控制,比较适合做FLASH的在线社区类游戏。通过对以上图片进行处理,最终响应鼠标动作,而形成角色走动。角色引擎代码如下:
- package com.d5power
- {
- import flash.display.Bitmap;
- import flash.display.BitmapData;
- import flash.display.Loader;
- import flash.display.Sprite;
- import flash.events.Event;
- import flash.events.IOErrorEvent;
- import flash.events.TimerEvent;
- import flash.geom.Point;
- import flash.geom.Rectangle;
- import flash.net.URLRequest;
- import flash.utils.Timer;
- import mx.controls.Alert;
- public class D5Player extends Sprite
- {
- /**
- * 构造函数
- * 输入内容包括以下:
- * @param playerDoc:角色素材
- * @param 角色的基本宽度
- * @param height:角色的基本高度
- */
- public function D5Player(playerDoc:String,width:uint,height:uint):void
- {
- // 初始化
- myWidth=width;
- myHeight=height;
- myStep=0;
- myDirection=0;
- mySpeed=5;
- myTimer=new Timer(100);
- myTimer.addEventListener(TimerEvent.TIMER,drawPlayer);
- myLoader=new Loader();
- myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,makePlayerMaps);
- myLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandle);
- myLoader.load(new URLRequest(playerDoc));
- }
- /**
- * 生成初始图象
- * @param d 初始状态的方向
- */
- public function Display(d:uint,p:uint=99):void
- {
- // 清空MAP
- if(map!=null)
- {
- this.removeChild(map);
- }
- pointer= p==99 ? pointer : p;
- map=new Bitmap(maps[d][pointer]);
- this.addChild(map);
- }
- /**
- * 控制角色移动到特定的位置
- * 在移动的过程中,根据角色的坐标来判断其正确的方向
- * @param x 目标位置的X坐标
- * @param y 目标位置的Y坐标
- */
- public function moveto(x:int,y:int):void
- {
- // 计算真实距离
- // 以模拟注册点在脚下
- targetX=x-myWidth*0.5;
- targetY=y-myHeight;
- this.run();
- }
- /**
- * 设置角色方向
- * $param d 想要设置的角色方向
- */
- public function set direction(d:uint):void
- {
- myDirection=d;
- }
- /**
- * 读取IO错误
- */
- public function ioErrorHandle(e:IOErrorEvent):void
- {
- Alert("IOErrorEvent");
- }
- /**
- * 调试函数,返回调试信息
- */
- public function getDebuger():String
- {
- return myDebuger;
- }
- /**
- * 运行
- */
- private function run():void
- {
- myTimer.start();
- }
- /**
- * 停止
- */
- private function stop():void
- {
- // 将角色设置在当前方向的第一帧
- Display(myDirection,0);
- myTimer.stop();
- }
- /**
- * 绘制角色
- * 从数组中读取特定方向各动作,并循环显示形成动画
- */
- private function drawPlayer(e:TimerEvent):void
- {
- movePlayer();
- // 清空MAP
- if(map!=null)
- {
- this.removeChild(map);
- }
- // 获取新的角色图象
- map=new Bitmap(maps[myDirection][pointer]);
- this.addChild(map);
- // 循环控制
- if(pointer<myStep-1)
- {
- pointer++;
- }else{
- pointer=0;
- }
- }
- /**
- * 角色移动控制
- */
- private function movePlayer():void
- {
- var xdirection:int;
- if(Math.abs(targetX-x)>mySpeed)
- {
- xdirection=(targetX-x)>0 ? 1 : -1;
- x+=mySpeed*xdirection;
- }else{
- x=targetX;
- xdirection=0;
- }
- var ydirection:int;
- if(Math.abs(targetY-y)>mySpeed)
- {
- ydirection=(targetY-y)>0 ? 1 : -1;
- y+=mySpeed*ydirection;
- }else{
- y=targetY;
- ydirection=0;
- }
- myDebuger=xdirection+":"+ydirection;
- // 设置方向
- switch(xdirection)
- {
- case 1:
- switch(ydirection)
- {
- case 0: this.direction=2; break;
- case 1: this.direction=5; break;
- case -1: this.direction=7; break;
- default:break;
- }
- break;
- case -1:
- switch(ydirection)
- {
- case 0: this.direction=1; break;
- case 1: this.direction=4; break;
- case -1: this.direction=6; break;
- default:break;
- }
- break;
- case 0:
- switch(ydirection)
- {
- case 0: stop(); break;
- case 1: this.direction=0; break;
- case -1: this.direction=3; break;
- default:break;
- }
- break;
- default:break;
- }
- }
- /**
- * 角色初始化
- * 将角色各方向各动作加入数组中
- */
- private function makePlayerMaps(e:Event):void
- {
- var bitmap_temp:BitmapData=new BitmapData(myLoader.width,myLoader.height,true,0x00FFFFFF);
- bitmap_temp.draw(myLoader);
- // 计算步数
- myStep=Math.floor(myLoader.width/myWidth);
- for(var i:uint=0;i<Math.floor(myLoader.height/myHeight);i++)
- {
- var arr:Array=new Array();
- for(var m:uint=0;m<myStep;m++)
- {
- var bmp_t:BitmapData=new BitmapData(myWidth,myHeight,true,0x00FFFFFF);
- bmp_t.copyPixels(bitmap_temp,new Rectangle(myWidth*m,myHeight*i,myWidth,myHeight),new Point(0,0));
- arr.push(bmp_t);
- }
- maps.push(arr);
- }
- // 释放资源
- bitmap_temp.dispose();
- }
- /**@private */
- private var maps:Array=new Array(); // 角色资料数组
- private var map:Bitmap; // 显示用对象,将通过不段刷新本对象来显示动画效果
- private var myDirection:uint; // 方向控制
- private var myLoader:Loader; // 素材加载用Loader对象
- private var myTimer:Timer; // 计时器,用来控制动画效果
- private var myWidth:uint; // 角色默认宽度
- private var myHeight:uint; // 角色默认高度
- private var myStep:uint; // 总步数
- private var pointer:uint; // 当前步数
- private var myDebuger:String = new String();
- /**@private */
- private var targetX:int; // 移动的目标位置X
- private var targetY:int; // 移动的目标位置Y
- private var mySpeed:int; // 移动速度
- }
- }