zoukankan      html  css  js  c++  java
  • 游戏开发纯代码切图做动画

    bitMap以及bitMapData的使用技巧,在flash里想要做动画做得炫,你就必须得熟知这两个玩意儿的用法,

    而我们今天就来探讨其中的一种技巧:切图。
    copyPixels(), 它的作用是把一个bitmapData整体中的一部分像素复制出来给另一个bitmapData,

    这是一张256 * 256像素的图片,长度么应该是256 / 4 宽度也是 256 / 4

    [Embed(source="melee.png")]
            private var resource:Class;
                    
            private var displayBMP:Bitmap;
            private var displayBMPD:BitmapData;
            private var sourceBMPD:BitmapData;
            private var i:int = 0;
            public function Main()
            {
                sourceBMPD = (new resource() as Bitmap).bitmapData; //先拿到目标图像数据
                displayBMP = new Bitmap(); //这是我们用来盛放切下来的图像数据并显示的东东哦
                addChild( displayBMP );
                       displayBMPD = new BitmapData(64,64); //切图开始
               displayBMPD.copyPixels( sourceBMPD, new Rectangle( 006464 ), new Point( 00 ) );
               displayBMP.bitmapData = displayBMPD; //切下来的BitmapData必须放到已添加至舞台的bitmap中才能显示出来哦
             }

    我们现在想做一个动画咋办?这图片一行的四张图片看起来可以组成一个连贯的攻击动作,

    那我们就试试看把这四个图片组成一个动画吧。

    做动画之前我们先想想具体的思路是怎样的,

    我们知道,一个位图bitmap的外观改变无非就是其内部的bitmapData发生了改变而已,

    那我们就隔一阵子改变一下它的BitmapData好了,

    不过使用enterFrame来改变的话动画会播放太快了,因为一般的swf帧频都有30多,

    就是一秒播放30多帧,此时我们就需要推出一个新的计时器类:Timer。

                    [Embed(source="melee.png")]
                    private var resource:Class;
                    
                    private var displayBMP:Bitmap;
                    private var displayBMPD:BitmapData;
                    private var sourceBMPD:BitmapData;
                    private var i:int = 0;
                    public function Main()
                    {
                            sourceBMPD = (new resource() as Bitmap).bitmapData;
                            displayBMP = new Bitmap();
                            addChild( displayBMP );
                            
                            var timer:Timer = new Timer(100); //限定计时器每100毫秒触发一次
                            timer.addEventListener(TimerEvent.TIMER, timerHandler);
                            timer.start(); //启动计时器
                    }
                    
                    private function timerHandler( event:TimerEvent ):void{
                            displayBMPD = new BitmapData(64,64);
                            displayBMPD.copyPixels( sourceBMPD, new Rectangle( i * 6406464 ), new Point( 00 ) );//因为我们要切割的4张图片都在一行上,所以只需要改变切图的x位置即可
                            displayBMP.bitmapData = displayBMPD;
                            if(i==3)i=0//若是当前所切图已到行尾最后一张图片,那就从行首第一张图片从新开始切过
                            else i++;
                    }
            



     

  • 相关阅读:
    back-不忘初心,方得始终。讲讲我主场3个月的经历。题外话。
    js中event事件对象的兼容问题以及坐标属性-(clientX clientY;pageX,pageY,offsetX,offsetY)
    布局(左边的div随着右边div的高度变化而变化)
    事件委托如何实现的原理
    寄生组合式继承方法的实现以及原理总结
    封装判断一个字符的后缀名和前缀的方法
    经典的面试题如果不通过其他任何变量实现两个数值类型的变量互相更换值。
    【十次方基础教程(后台)】Dockerfile脚本完成镜像的构建
    【十次方基础教程(后台)】安装并启动RabbitMQ
    【十次方基础教程(后台)】docker下安装head插件来进行Elasticsearch的操作
  • 原文地址:https://www.cnblogs.com/naiking/p/2272443.html
Copyright © 2011-2022 走看看