您的位置:首页 > 其它

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

2008-06-12 10:57 309 查看
物素材:




运行效果:

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

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: