這裏以《神仙道》中某一人物資源爲例子,它的每一個動作都經過了處理,以中心點爲基準點(這樣就不需要程序來控制偏移量了,否則程序要改變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 <=> 序列索引/間隔幀數)
兩種的處理方法呢,差不了太多,主要是由美術那邊渲染動作來決定的,如果都是以中心點來渲就沒有這個問題,如果連續不太規則的就需要使用配置來說明,每一張序列圖它的偏移量,寬和高。