as3解析人物动作序列图

这里以《神仙道》中某一人物资源为例子,它的每一个动作都经过了处理,以中心点为基准点(这样就不需要程序来控制偏移量了,否则程序要改变bitmapData时还需要改变bitmap的坐标)。

一个跑动的动作它细分为20张图片,每一张图片它的大小为:1900 / 20 = 95px;

1、加载资源

2、分解动作

parseBitmapData(bmpData, 95, 118);

private function parseBitmapData(bmpData:BitmapData, w:Number, h:Number):void
{
var matrix:Matrix = new Matrix();
var rectangle:Rectangle = new Rectangle();
var pt:Point = new Point();

rectangle.width = w;
rectangle.height = h;

var actionCount:int = 20;

while (actionCount--)
{
var bmd:BitmapData = new BitmapData(rectangle.width, rectangle.height, true, 0);
bmd.copyPixels(bmpData, rectangle, pt);

rectangle.x += rectangle.width;

_actionList.push(bmd);
}
}

3、播放动作(可使用enterframe或者timer进行处理)

private function initPlay():void
{
_currFrame = 0;
_actionIdx = 0;

_bmd = new Bitmap(_actionList[_actionIdx], 'auto', true);
_bmd.x = 100;
_bmd.y = 100;
addChild(_bmd);

addEventListener(Event.ENTER_FRAME, onEnterFrame);
}

private function onEnterFrame(evt:Event):void
{
_currFrame++;
if (_currFrame % 1 == 0)
{
_actionIdx++;

if (_actionIdx >= _actionList.length)
{
_actionIdx = 0;
}

_bmd.bitmapData = _actionList[_actionIdx];


//人物移动
_bmd.x += _moveStep;

if (_bmd.x > stage.stageWidth || _bmd.x < 0)
{
_moveStep *= -1;
_bmd.scaleX *= -1;
}

}
}

上面_currFrame % 1,这里可以注释掉,之所有留着的原因是因为有些动作(比如“闪避”)它每一步播放的间隔帧数可能不太一样(一般是通过配置来确定)。

最后上面示例代码运行的效果如下,来回跑:

这只是一个demo,提供一个思路,具体到游戏产品中,所有的行走、打坐、坐骑..是通过一个全局的管理器(比如EnterFrame处理器)来控制的。

fla和swf文件打包上传到百度云,压缩包的下载地址>>   (注:我使用的flash版本是cs5.5,如果使用低版本的flash是打不开源文件的)

如果动作序列图不是上面这样,它是以左顶点为基准来进行动作处理的,那么就需要配置各种偏移量了,比如下面这个:

这个只是我从XML配置文件里截取的某一个动作的配置。配置文件里面其实还有每一张序列图之间间隔的帧数,类似下面的配置

18表示,该动作由18张序列图组成,i里面就是各个序列图执行时的间隔帧数,上面的是2(1/2 <=> 序列索引/间隔帧数)

两种的处理方法呢,差不了太多,主要是由美术那边渲染动作来决定的,如果都是以中心点来渲就没有这个问题,如果连续不太规则的就需要使用配置来说明,每一张序列图它的偏移量,宽和高。

原文地址:https://www.cnblogs.com/meteoric_cry/p/2919071.html