概述
熟悉flash遊戲引擎的人都知道,flash遊戲開發中主要用2種渲染方式來實現遊戲邏輯。
- 顯示列表
即顯示單位爲DisplayObject - 位圖
所有的顯示單位都是BitmapData
這裏不討論這2種方式哪個好哪個壞,感興趣的朋友可以搜索"Flash遊戲引擎"。比較有名的有pushbutton engine,flixel,FlashPunk等。
位圖引擎概念
就是一種基於BitmapData的圖像緩衝技術,由開發者來確定圖形渲染中,哪些內容該畫如何畫。可以理解爲畫畫。我們打開一張紙,然後在畫面上填充我們想要的東西。適用於大量的單位繪製,比如說粒子系統,射擊類遊戲,跑酷類遊戲。
位圖引擎的實現
- 世界 CWorld
世界就是一個畫布,位圖緩衝區,所有遊戲世界種的精靈都存在於此。
- 精靈 CWorldSprite
世界中的一個顯示對象,比如一發子彈,一架飛機等等。
- 攝像機 CWorldCamera
如果一個世界足夠大,那麼不可能在一個屏幕裏顯示所有的精靈,因此需要捲動屏幕顯示不同位置的精靈,即卷軸。
CWorld是一個Bitmap的繼承類,主要負責將最終渲染結果顯示到Sprite裏面。 在CWorld裏有一個數組 private var _sprites : Vector.<CWorldSprite> = new Vector.<CWorldSprite>(); 該數組實際上就保存了這個世界裏的所有的精靈,精靈最終都以BitmapData的形式繪製到CWorld的緩衝區裏面。 對於位圖引擎來說,攝像機的作用就是計算所有的精靈應該畫到世界緩衝區的什麼位置。 CWorld的這個函數就是最終將所有精靈繪製到世界緩衝區上。 protected function renderSprites(g:IGraphics, sprites:Vector.<CWorldSprite>) : void { var x1:int = getCameraX(); var y1:int = getCameraY(); var x2:int = getCameraX() + getCameraWidth(); var y2:int = getCameraY() + getCameraHeight(); for each (var spr : CWorldSprite in sprites) { if(CMath.intersectRect( spr.x + spr.getAnimates().w_left, spr.y + spr.getAnimates().w_top, spr.x + spr.getAnimates().w_right, spr.y + spr.getAnimates().w_bottom, x1, y1, x2, y2)) { spr.render(g, spr.x - x1, spr.y - y1, spr.getCurrentAnimate(), spr.getCurrentFrame()); } } } CWorldSprite.render,此方法最終會調用到CWorld的bitmapData的copyPixels方法或draw方法。 這裏的sourceBitmapData就是包含在精靈裏的圖片資源BitmapData,將精靈的圖片複製或繪製到世界的緩衝區裏。 以上是實現位圖引擎的核心思想和邏輯。
使畫面動起來
位圖引擎需要每幀都對緩衝區重繪更新,所以EnterFrame事件可以滿足這個需求。 在主Sprite裏,添加EnterFrame的事件監聽。將cworld創建出來後添加到Sprite容器裏。 在你的EnterFrame事件裏寫 public function update(e:Event) : void { //更新世界中所有精靈的邏輯(比如移動,播放動畫幀等等。) cworld.update(); //重繪世界所有精靈 cworld.render(); } 遊戲邏輯需要和渲染邏輯分開以適應比如說暫停時的一些功能。 此時,一個遊戲主循環框架就出來了,你只需要管理cworld裏所有的精靈的狀態來控制遊戲邏輯。