在設計一個基礎的平台射擊遊戲時,子彈是必定得實現的物件。
然而在實作子彈的過程中,初學者往往會犯上一些小錯誤。
本文列舉出幾個常見的錯誤,以供參考
最簡範例
以下範例主角[player]擁有兩組動畫: <idle>與<fire>。[player]攜帶<Platform>平台特性。
透過對<A><D>鍵的設置我們可以移動[player],並且以<set mirror>指令進行影像水平翻轉。
在按下<Space>鍵時,將會在[player]座標上產生一個新的[bullet]實例,[bullet]攜帶有<Bullet>特性因此會向前方飛行。
而所謂的前方,就是[bullet]實例之影像在繪製時,其0度角指向方向。為了讓大家看清楚,我們刻意點上了一小點墨綠色。
運行,一切正常:
接下來是錯誤示範。
錯誤示範#1
搞錯事件母子關係。注意看下圖中事件#4,#5,這個糊塗蟲把原本應隸屬於#3鍵盤觸發指令的程式碼,通通搬到根層級去了。
如此一來在遊戲進行中,只要[player]轉向,全體子彈就會按照事件#4,#5的設置改變。
為什麼是全體子彈呢?因為在根層級,關卡內所有物件是處於全部被選中的狀態。
錯誤示範#2
這位同學為了讓程式模塊化(modulization),使用Function函數將轉向功能移至<turn>函數內。
這樣做,一樣會出現選取範圍的問題。這個問題我稱為<Create objet>/<Spawn object>的陷阱。請先理解以下C2 create指令的特性
- create完畢後,該物件類型的選取範圍會縮限至剛剛產生那一枚實例。
- 上述之縮限,會在create動作執行後成立,並隨create所屬事件之結束而結束
以此觀念來看,在#3內呼叫"turn"函數後會跳到#5執行,而#5是位於根層級啊!所以#5開始執行時,選中的[bullet]是關卡內全數的[bullet]實例,也就造成了嘗試牽一髮卻誤動全身的狀況。
精簡寫法
在理解了上述常見錯誤後,我們於文末提出一組精簡精良的寫法。而這個精簡得力於Rexrainbow的<SpriteExt>行為插件:
<SpriteExt>可使用表達式偵測物件目前mirror狀況。偵測到之後我們使用A?B:C這個分岔邏輯語句直接給定子彈角度。
運行結果一切正常,並且縮短了事件表,工作起來清爽多了。
暂无关于此日志的评论。