精品无码国产污污污免费网站-成人无码一区二区三区-国产一区二区三区不卡在线观看-无码国产午夜福利片在线观看-亚洲 欧美 偷自乱 图片-日本乱偷人妻中文字幕

您的位置:首頁(yè) >觀察 > 正文

每日速看!DH-SRPG 三:?jiǎn)挝坏某鰬?zhàn)與部署

大多數(shù)戰(zhàn)棋游戲都有予玩家在戰(zhàn)斗開(kāi)始前根據(jù)游戲的局勢(shì)對(duì)作戰(zhàn)單位的挑選以及位置部署的能力,本項(xiàng)目也是如此的?,F(xiàn)在來(lái)看看在本項(xiàng)目中的單位出戰(zhàn)功能與部署功能是如何實(shí)現(xiàn)的。

這是單位挑選場(chǎng)景的節(jié)點(diǎn)結(jié)構(gòu)的折疊圖(完整的節(jié)點(diǎn)樹(shù)見(jiàn)文章末尾),有6部分:

(注:CR為custom_這個(gè)場(chǎng)景的縮寫(xiě),沒(méi)有實(shí)際意義)


【資料圖】

TitleCR:顯示標(biāo)題

UnitInfo: 顯示Pointer指向的單位的信息。

InfoCR:顯示如已出戰(zhàn)人數(shù)等信息

UnitList:?jiǎn)挝坏牧斜?,用?lái)顯示單位的圖像與名字等縮略信息,該節(jié)點(diǎn)下面有一個(gè)TempUnitItem的單位模板

Items:顯示功能選項(xiàng),如“出擊”和”觀察“選項(xiàng)在這個(gè)節(jié)點(diǎn)下

Pointer:一個(gè)用來(lái)顯示現(xiàn)在選中的項(xiàng)的框

屬性:

start:這個(gè)方法用于啟動(dòng)并接受一個(gè)單位數(shù)組來(lái)設(shè)置這個(gè)場(chǎng)景。該方法由上一節(jié)介紹的Scene調(diào)用,單位數(shù)組就是由Scene的create_units方法提供的。

下面來(lái)是對(duì)于輸入事件的處理

這里面做了兩件事,一是在不同狀態(tài)下的切換操作二是根據(jù)模式分配輸入事件給不同的方法處理。

然后是對(duì)輸入事件的一個(gè)攔截控制,因?yàn)樵凇坝^察模式”下,Scene的指針是需要接受得到輸入事件來(lái)移動(dòng)與查看場(chǎng)景信息的所以在“觀察模式”不會(huì)攔截輸入事件,而不是“觀察模式”時(shí),面板是顯示的,不希望Scene的指針接受到輸入事件來(lái)移動(dòng)哦,所以需要用get_viewport().set_input_as_handled()方法來(lái)攔截輸入事件阻止它繼續(xù)傳遞。

_btn_list_move:處理Pointer在Items上的移動(dòng)與點(diǎn)擊,

在這個(gè)方法中,“出擊”匹配項(xiàng)會(huì)發(fā)出了一個(gè)"depart_signal"信號(hào),這個(gè)信號(hào)表示要開(kāi)始進(jìn)行戰(zhàn)斗并代表玩家已經(jīng)挑選好了出戰(zhàn)的成員。這個(gè)信號(hào)在Scene節(jié)點(diǎn)進(jìn)行連接:

可以看到這個(gè)游戲的開(kāi)始由depart_signal這個(gè)信號(hào)決定的,這個(gè)lambda里面做了一些準(zhǔn)備工作,例如關(guān)閉挑選界面的UI以及將我們挑選的這些單位的控制權(quán)交給玩家(其他沒(méi)有挑選的單位都是沒(méi)有控制權(quán)的)并將這些單位加入U(xiǎn)nitManage來(lái)進(jìn)行單位注冊(cè)。

_unit_list_move:處理Pointer在單位列表上的移動(dòng)與點(diǎn)擊

可以看到這兩個(gè)方法的邏輯與是大致相同的。

在發(fā)出"add_unit_signal"添加信號(hào)與"remove_unit_signal"刪除信號(hào)時(shí),都會(huì)由Scene節(jié)點(diǎn)的子節(jié)點(diǎn)Deploy處理。這個(gè)信號(hào)在Scene的_ready方法中進(jìn)行連接:

Deploy:部署點(diǎn),部署點(diǎn)是在挑選出戰(zhàn)成員時(shí)可供單位部署的位置。

上一節(jié)有簡(jiǎn)要的概括?,F(xiàn)在來(lái)詳細(xì)看一下Deploy的使用方法。要使用Deploy需要先給它添加任意個(gè)有position屬性的節(jié)點(diǎn)作為子節(jié)點(diǎn)。

它根據(jù)子節(jié)點(diǎn)來(lái)決定可選位的數(shù)量與位置。

在制作關(guān)卡時(shí),只需要給它添加Sprite節(jié)點(diǎn)(其他的也可以)來(lái)決定部署點(diǎn)的位置。

不過(guò)目前部署點(diǎn)是在運(yùn)行時(shí)決定的,如果需要多次使用Deploy與要在游戲過(guò)程中改變Deploy需要對(duì)這部分進(jìn)行調(diào)整(后續(xù)應(yīng)該會(huì)進(jìn)行調(diào)整)。

Scene將PreparePlan的add_unit_signal與remove_unit_signal信號(hào)都交由Deploy進(jìn)行處理,它們的實(shí)現(xiàn)很簡(jiǎn)單,就是遍歷positions找到?jīng)]有使用的位置就進(jìn)行設(shè)置,或者找到要?jiǎng)h除的unit就進(jìn)行刪除

在觀察模式下進(jìn)行單位位置的調(diào)整

上面在PreparePlan的_btn_list_move方法中有提到“觀察模式”,在加入觀察模式時(shí),PreparePlan顯示的節(jié)點(diǎn)將發(fā)生變化,它會(huì)隱藏部分面板,并且不再阻止輸入事件的傳遞。這將允許玩家操作Scene的Pointer來(lái)操作部署點(diǎn)與查看敵方的棋子信息。

這時(shí)Scene將會(huì)根據(jù)Deploy的顯示狀態(tài)來(lái)將Pointer點(diǎn)擊事件交給Deploy處理

deploy的pointer_callable方法會(huì)在沒(méi)有選中unit時(shí)嘗試進(jìn)行選中,在已經(jīng)選中unit時(shí)會(huì)嘗試進(jìn)行位置交換

這一系列的組合的效果:

在調(diào)整好位置后,就可以開(kāi)始戰(zhàn)斗了。

總結(jié)

PreparePlan決定出戰(zhàn)單位,Deploy決定單位的位置。PreparePlan與Deploy之間沒(méi)有直接聯(lián)系,由Scene作為橋梁。這得益于Godot的信號(hào)機(jī)制。

在創(chuàng)建新關(guān)卡時(shí),只需要給Deploy添加擁有位置屬性的子節(jié)點(diǎn)即可。而最大出戰(zhàn)人數(shù)則需要在PreparePlan的檢查器中調(diào)整,需要勾選“子節(jié)點(diǎn)可編輯”選項(xiàng)。

下一節(jié)我們將介紹一下用于管理單位的UnitManage,看它是如何管理Unit的行動(dòng)的。

致歉:因?yàn)轫?xiàng)目的更新隨時(shí)都有可能會(huì)破壞原有的代碼,您在看到此文時(shí)它可能已經(jīng)不是最新的了,請(qǐng)以現(xiàn)在項(xiàng)目的具體情況為準(zhǔn)。歡迎大家給項(xiàng)目提Issues項(xiàng)目地址:/DH-DoveG/dh-srpg-demo

關(guān)鍵詞

圖片新聞