Flash位圖引擎解決方案

概述

熟悉flash遊戲引擎的人都知道,flash遊戲開發中主要用2種渲染方式來實現遊戲邏輯。

  1. 顯示列表
    即顯示單位爲DisplayObject
  2. 位圖
    所有的顯示單位都是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,此方法最終會調用到CWorldbitmapDatacopyPixels方法或draw方法。
這裏的sourceBitmapData就是包含在精靈裏的圖片資源BitmapData,將精靈的圖片複製或繪製到世界的緩衝區裏。

以上是實現位圖引擎的核心思想和邏輯。

使畫面動起來

位圖引擎需要每幀都對緩衝區重繪更新,所以EnterFrame事件可以滿足這個需求。
在主Sprite裏,添加EnterFrame的事件監聽。將cworld創建出來後添加到Sprite容器裏。
在你的EnterFrame事件裏寫
public function update(e:Event) : void 
{
        //更新世界中所有精靈的邏輯(比如移動,播放動畫幀等等。)
        cworld.update();
        //重繪世界所有精靈
        cworld.render();
}
遊戲邏輯需要和渲染邏輯分開以適應比如說暫停時的一些功能。
此時,一個遊戲主循環框架就出來了,你只需要管理cworld裏所有的精靈的狀態來控制遊戲邏輯。
發佈了340 篇原創文章 · 獲贊 25 · 訪問量 98萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章