代码拾取图片某一点的颜色_RPG游戏开发日志7:道具拾取与存放
本項目同步上傳于github和coding上,國內(nèi)讀者可以通過在coding下載項目。
也歡迎你加入我的UE4學(xué)習(xí)交流QQ群:872537977。如果你喜歡我寫的文章,也希望你點贊、收藏、轉(zhuǎn)發(fā)。謝謝!
如果你喜歡我寫的文章,也希望你點贊、收藏、轉(zhuǎn)發(fā)。謝謝!
如果你想?yún)⑴c到這個項目的開發(fā)中來,唯一的要求是像我一樣編寫開發(fā)日志讓更多的人看到并學(xué)習(xí)。
github地址:https://github.com/Liweimin0512/uRPG
coding地址:https://git.dev.tencent.com/JeremyBrett/uRPG.git
這一期我們實現(xiàn)道具的拾取和存放
需求分析
上一期中我們設(shè)計了一個掉落物的列表。這一期我們繼續(xù)處理當(dāng)列表中的道具被點擊后,將道具保存到玩家的背包中的操作。
我們首先制作一個極簡的背包,它不需要通過主界面的圖標(biāo)跳轉(zhuǎn)到專屬的界面。而只是在主界面下方的一排“快捷欄”。因為其實現(xiàn)的原理是一致的。希望小伙伴們能舉一反三吧。
首先,我們依然要客串策劃的工作。策劃同學(xué)突然靈光一閃,覺得道具和掉落物應(yīng)該是一一對應(yīng)的,而掉落物的參數(shù)是可配置的。
DropData與Item的對應(yīng)關(guān)系
通過思考,我們對這部分代碼進行了重構(gòu)。首先是我們創(chuàng)建了一個DropData的結(jié)構(gòu)體如下圖所示,默認值就設(shè)置成之間的掉落物本來該有的值:
s_DropData這里設(shè)置比較簡單,掉落物的模型、特效及拾取半徑都是可以配置的。
然后我們在原有的ItemData中引用這個結(jié)構(gòu)體,如下圖所示:
ItemData中引用構(gòu)建Bp_master_DropBase
我們在Bp_master_DropBase中,首先將相關(guān)變量都勾選成“可編輯實例”和“在生成時顯示”。并且編寫藍圖的構(gòu)建腳本如下圖所示:
Bp_master_DropBase的構(gòu)建腳本構(gòu)建腳本,顧名思義就是在藍圖構(gòu)建時調(diào)用的(大概),總之是比BeginPlay事件要早。
當(dāng)玩家進出凋落物的拾取范圍呢?依然是調(diào)用玩家角色身上的UpdateDropItemList方法。
調(diào)用UpdateDropItemList
這個方法的實現(xiàn)目前看依然很尷尬,只是做了一個傳話筒,但是我們這么寫的目的是為了搭出架子來,在之后的修改中會更方便。
Drop函數(shù)的重構(gòu)
再次改寫Drop函數(shù),其實是因為Bp_master_DropBase這個藍圖本身做了調(diào)整,它除開存放本身外顯的一些參數(shù)外,還存放了一個s_ItemState的結(jié)構(gòu)體變量:
s_ItemState這個結(jié)構(gòu)體很常用,是保存玩家所擁有的道具及道具數(shù)量的簡單結(jié)構(gòu)體。
Drop函數(shù)的改變可以看出Drop函數(shù)的改變主要來自于ItemState簡單了許多,只需要傳入道具Id和數(shù)量即可。而Drop相關(guān)的參數(shù),也是通過查詢ItemList表格獲取到的。
UMG_PickupList的處理
UMG_PickupList主要是UpdateListView這個函數(shù)的實現(xiàn),這也是目前比較關(guān)鍵的一步。首先,我們根據(jù)Add?判斷是添加還是移除元素從ItemStatList這個集合中,同時對PickupListView進行一次清理操作
ItemStatList操作然后我們遍歷ItemStatList中的元素,逐個添加到PickupListView中
添加操作由于這部分都是對上一期中代碼的重構(gòu),因此不詳細介紹思路了就。
UMG_ItemInventory
上文的內(nèi)容,都是對過往代碼的重構(gòu),從這里開始,才進入本篇文章的主題。首先,我們創(chuàng)建一個主界面控件——快捷欄控件。它長這樣:
UMG_ItemInventory的設(shè)計如果你細心觀察,會發(fā)現(xiàn)其實這個Weiget只使用了一個HorizontalBox組件,如何實現(xiàn)?這就要引出PreConstruct這個事件了,他有點類似于藍圖的構(gòu)造腳本。在編輯器中就可以展現(xiàn)事件中所進行的修改。我這里進行的修改很簡單
PreConstruct創(chuàng)建了10個UMG_Item并將其添加到HorizontalBox組件上,同時,為了進行邏輯上的記錄,還將其保存在一個名為ItemIndex的map中
ItemIndex
至于UMG_Item這個Weiget呢,相信你已經(jīng)猜出來了。
它由背景圖片,道具圖片和道具數(shù)量三部分組成,并且默認情況下(沒有道具時)道具圖標(biāo)、道具數(shù)量都是隱藏的,只顯示背景圖片。(ps:寫到這里突然感覺實現(xiàn)方式有問題,懶得改了,下期再說)
OnItemClicked事件
ListView很重要的一個事件,就是當(dāng)列表中的某一項被點擊時候調(diào)用的OnItemClicked事件。我們這里要用這個事件,當(dāng)點擊時,將掉落物添加到背包中并從拾取物列表中移除。
OnItemClicked這里我們并沒有直接處理,而是將操作權(quán)交給了Controller。不過,還是將干掉掉落物的操作直接在這里實現(xiàn)了。(似乎也是不合理的部分,之后優(yōu)化吧。)
那么Controller怎么操作的呢?他首先通知Character做相應(yīng)的操作(SetItemValue),然后通知主界面做相應(yīng)操作(UpdateItemInventory)
F_Pickup而UpdateItemInventory顧名思義,就是更新一下背包。這個函數(shù)可以再每次打開背包的時候調(diào)用,這里因為是直接顯示在快捷欄中,因此當(dāng)撿起道具時候就應(yīng)該直接顯式調(diào)用一次。
UpdateItemInventory首先就是遍歷ItemMap,然后根據(jù)其中存儲的ItemID通過查表將道具圖標(biāo)和數(shù)量顯示出來,需要注意的是,圖標(biāo)和數(shù)量的控件默認都是隱藏的,這里需要將其設(shè)置為顯示的。
至此,將道具存放到背包中的功能就算是完成了。
下期預(yù)告
在之后的一段時間,我想研究一下任務(wù)系統(tǒng)的實現(xiàn)。至于道具系統(tǒng)更深入的開發(fā),就留給任務(wù)系統(tǒng)之后來做。
或者說是制作一個簡易的任務(wù)系統(tǒng),然后補充這些基礎(chǔ)系統(tǒng)的文檔后。再重構(gòu)更為精巧的技能、任務(wù)和道具系統(tǒng)。
總結(jié)
以上是生活随笔為你收集整理的代码拾取图片某一点的颜色_RPG游戏开发日志7:道具拾取与存放的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想电脑y480(联想电脑y480n)
- 下一篇: 怎么从电脑下歌到v盘(v盘在电脑上怎样下