2012年12月14日 星期五

自製小遊戲引擎 - 遊戲舞台架構

這篇想談一下自製遊戲引擎的架構,整個架構上其實很大部分是參考了libgdx的概念:演員(Actor)跟舞台(Stage)。因為整個引擎繪製的結果都呈現在一個Canvas物件上,於是設計上也就把整個遊戲的主體SGameHost.java設計為類似單一舞台的概念,並設計演員的類別SGameUnit.java。如果只是要開發一個簡單的小遊戲的話,只要架設好一個基本舞台,設計好不同演員加入舞台後,整個遊戲就可以運作了。也就是說,演員的設計會是比較重要的部分,不同的演員設計方式,甚至可以改變整個遊戲的類型。



演員最基本的特性如下:在舞台上擁有一個2D的座標(預設的繪圖依據)、擁有不同狀態的動畫圖片、會與在同一舞台中其他的演員發生碰撞。當然,可以自己加入其他程式碼在update的function中,來對此演員做出一些額外的控制。由於最初始的開發是朝射擊遊戲的方向前進,因此繼承延伸出了幾種不同的抽象演員:玩家、敵人、子彈、道具、特效,下面對各個抽象類別簡單說明一下:
玩家每次更新的時候,應該依據目前的輸入(鍵盤、滑鼠等)來對玩家進行移動或發射子彈的動作,且依據玩家目前的狀態決定該被繪製的動畫圖片(繪製"往左移動"的動畫或"往右移動"的動畫),並且會與敵人、敵人的子彈、道具發生碰撞,碰撞效果交給碰撞對方決定。
敵人每次更新依照所設定的AI進行移動、子彈發射以及決定繪圖所使用的動畫,會與玩家、玩家的子彈碰撞,如果撞到玩家,就對玩家造成傷害。
子彈在被創造時就必須先決定屬於玩家側或敵人側,每次更新依照所指定的速度移動、決定繪圖使用的動畫,會與不同陣營的玩家或敵人碰撞,碰撞後造成對方傷害,並自我銷毀。
道具更新時依照指定的路線進行移動、決定繪圖使用的動畫,會與玩家發生碰撞,並給予道具該發揮的效果。
特效在更新時決定所使用的動畫圖片,不會與任何演員碰撞,設定的倒數時間結束時自我銷毀。

透過上述所建立的規則,就可以很快的架構出一個簡單的射擊遊戲,大部分花的時間反而會是在編輯或繪製遊戲所使用的到圖片檔吧。
在遊戲更新的過程中,會先依照每位演員運算下一個時間點的移動與其他CUSTOM的動作,之後判定哪些演員要被消滅,最後判定演員之間的碰撞,還有發動碰撞中演員的碰撞效果。

當然,更深入的開發也是可能的。
例如在範例遊戲中,那個模仿某知名OLG的聖O召喚的子彈。在與敵人發生碰撞後並不會直接消失,而是與一定數量的敵人碰撞後才會消滅,原因就是因為該類別覆寫了子彈的抽象類別中,發生碰撞後碰撞效果的function,原本的程式中碰撞後會強制將子彈的生命值設定為-1,使其被判定為滅亡,但覆寫後將生命值強制設定為另一個碰撞倒數(從6開始)的變數,使子彈需要經過一定數量的碰撞後才會消滅。另一個例子是範例遊戲中,類似風之刃的大型攻擊。由於覆寫了判定滅亡的function,將"原本生命值低於1"的滅亡條件改變為"時間倒數",使風刃只要在倒數時間到之前都是不會被消滅的。並覆寫了原本碰撞的判定function,使原本不會與子彈發生碰撞的風刃,可以與敵方陣營的子彈發生碰撞並將其消滅。除了這些以外,碰撞範圍、繪圖位置、所得分數、附加狀態...等各種function都是可以被繼承並且修改的,也因此,只要能依照自己的需求適當的繼承並覆寫這些function,就能夠跳脫出射擊遊戲的框架,轉而開發其他型態的遊戲。

目前來說,至少像是守塔類、簡單的格鬥對戰、動作角色扮演等都是可能的實作範圍。

繪圖部分與舞台的流程留到再下一篇好了
希望我能盡快找時間寫出來

沒有留言 :

張貼留言