延續前一篇的話題,關於最後的"俄羅斯娃娃"程式碼至少包含以下的幾個問題:
if (integer.getAndIncrement() > 5)
內使用
integer.compareAndSet(6, 0);
就可以多次產生豬了,至於為什麼,有興趣的邦友可以想看看。BoundingBox
,這個部分我們並沒有一起更改。簡單的方式確認BoundingBox,可以透過在遊戲內按下F3 + B
來查看。其他還有豬的位置會跟我們移動的時候一起移動、可能會打不到縮小比例的豬...等等
既然問題這麼多,為什麼還要這樣寫呢?
因為,我們現在這種開發模組的方式,比較適合直覺型的功能開發。換句話說,當你今天要做的邏輯牽涉到"不是當前事件提供的功能就可以完成的",你就會需要處理其他事件發生時可能會有的情況。
還記得我們在[Day3] 讓打方塊動作有敲有回應提到的事件巴士 (EVENT_BUS)嗎?
Minecraft Forge是透過監聽不同的事件(Event)發生來進行的,而每一個事件需要透過事件巴士(EventBus)在事件處理器(Event Handler)內進行註冊(register)才可以使用。
我們到目前為止的開發方式都是以下的流程:
建立事件處理類別 -> 處理特定事件 -> 註冊類別到主程式內
有沒有注意到一件事情:我們並不是在建立"可以照順序處理"的功能,而是建立"等待被觸發"的功能!
因為事件是會被所有有在主程式內註冊的類別都可以看的到,我們在為了確保事件是依照我們想要的情況才被觸發,就會免不得用很多IF的判斷式來避開不想要處理的狀況:
等等,有勾起你在前幾天一起開發的回憶了嗎?
如果還沒有感覺的話,我們用一個模擬情況來說好了:
今天有一個事件,它透過事件巴士要完成以下的事情
想一想,如果上面的處理順序互換,整個事件就無法正常運行了。
因此這裡還是要再次強調:Minecraft Forge的事件處理是透過
事件發生 - 事件處理類別訂閱 - 訂閱者監聽事件並做出處理
來完成各個功能的,這個很重要,很重要,很重要。
今天花了一點時間再一次說明事件註冊的一些觀念,希望可以幫助各位在未來要開發自己的模組時,能夠"利其器,善其事",用最簡單的方式完成想要的功能。
今日額外課題:在一開始的截圖裡,我們將殭屍裝上全套的鑽石裝備。請試著自行做出一樣的模組出來吧!
提示:
setCurrentItemOrArmor
的方法,其中第一個參數從0-5分別代表手持、胸甲、護腿、鞋子、頭盔。new ItemStack()
接受Item類別,你可以直接透過Items
找到你想要的物品。