首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >as3解析人物动作序列图

as3解析人物动作序列图

作者头像
meteoric
发布2018-11-16 17:43:48
4270
发布2018-11-16 17:43:48
举报
文章被收录于专栏:游戏杂谈游戏杂谈游戏杂谈

这里以《神仙道》中某一人物资源为例子,它的每一个动作都经过了处理,以中心点为基准点(这样就不需要程序来控制偏移量了,否则程序要改变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 <=> 序列索引/间隔帧数)

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013-02-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档