Construct2/3

创建于:2017-02-24

创建人: iconboy

103 信息 371 成员
Construct2/3 引擎开发专题

[Construct 2基礎] 平台遊戲中的子彈發射

傅老師 2017-03-02

在設計一個基礎的平台射擊遊戲時,子彈是必定得實現的物件。
然而在實作子彈的過程中,初學者往往會犯上一些小錯誤。
本文列舉出幾個常見的錯誤,以供參考

最簡範例

以下範例主角[player]擁有兩組動畫: <idle>與<fire>。[player]攜帶<Platform>平台特性。

透過對<A><D>鍵的設置我們可以移動[player],並且以<set mirror>指令進行影像水平翻轉。


  [player]的動畫設置

在按下<Space>鍵時,將會在[player]座標上產生一個新的[bullet]實例,[bullet]攜帶有<Bullet>特性因此會向前方飛行。
而所謂的前方,就是[bullet]實例之影像在繪製時,其0度角指向方向。為了讓大家看清楚,我們刻意點上了一小點墨綠色


運行,一切正常:

Image title

接下來是錯誤示範。

錯誤示範#1

搞錯事件母子關係。注意看下圖中事件#4,#5,這個糊塗蟲把原本應隸屬於#3鍵盤觸發指令的程式碼,通通搬到根層級去了。
如此一來在遊戲進行中,只要[player]轉向,全體子彈就會按照事件#4,#5的設置改變。
為什麼是全體子彈呢?因為在根層級,關卡內所有物件是處於全部被選中的狀態


Image title

錯誤示範#2

這位同學為了讓程式模塊化(modulization),使用Function函數將轉向功能移至<turn>函數內。
這樣做,一樣會出現選取範圍的問題。這個問題我稱為<Create objet>/<Spawn object>的陷阱。請先理解以下C2 create指令的特性

  1. create完畢後,該物件類型的選取範圍會縮限剛剛產生一枚實例
  2. 上述之縮限,會在create動作執行後成立,並隨create所屬事件之結束而結束

以此觀念來看,在#3內呼叫"turn"函數後會跳到#5執行,而#5是位於根層級啊!所以#5開始執行時,選中的[bullet]是關卡內全數的[bullet]實例,也就造成了嘗試牽一髮卻誤動全身的狀況。


Image title

精簡寫法

在理解了上述常見錯誤後,我們於文末提出一組精簡精良的寫法。而這個精簡得力於Rexrainbow的<SpriteExt>行為插件:
<SpriteExt>可使用表達式偵測物件目前mirror狀況。偵測到之後我們使用A?B:C這個分岔邏輯語句直接給定子彈角度。



運行結果一切正常,並且縮短了事件表,工作起來清爽多了。


(转发自:原日志地址

近期喜欢的会员

 
totoyan 2017-03-02

太好了,傅老师这个教程可以给一些正在做子弹的萌新学习了!感谢老师!

 
StoneFan1987 2017-03-02

干货!炒鸡实用!

 
邱天 2017-03-08

傅老师威武!

 

加入 indienova

  • 建立个人/工作室档案
  • 建立开发中的游戏档案
  • 关注个人/工作室动态
  • 寻找合作伙伴共同开发
  • 寻求线上发行
  • 更多服务……
登录/注册