當(dāng)前熱文:如何制作一個(gè)羊了個(gè)羊游戲4:道具的實(shí)現(xiàn)

2023-01-12 17:32:59 來(lái)源:51CTO博客

本文首發(fā)于微信公眾號(hào)【小螞蟻教你做游戲】,歡迎關(guān)注領(lǐng)取更多學(xué)習(xí)做游戲的原創(chuàng)教程資料,每天學(xué)點(diǎn)兒游戲開(kāi)發(fā)知識(shí)。

嗨!大家好,我是小螞蟻。

今天是羊了個(gè)羊系列教程的最后一節(jié),我們來(lái)學(xué)習(xí)一下游戲中的三種道具的實(shí)現(xiàn)。


(資料圖)

這三種道具分別是:移出三張牌,撤回一步,隨機(jī)打亂順序。

接下來(lái),我們就依次來(lái)看一下每種道具的具體實(shí)現(xiàn)。

移出三張卡牌

這個(gè)道具的作用是從當(dāng)前的卡牌槽中移出前三張牌,把它們暫時(shí)放在卡牌槽的上方,移出的牌可以在后續(xù)再次加入到卡牌槽中。

使用移出道具時(shí),有可能會(huì)出現(xiàn)兩種情況。一種是當(dāng)前卡牌槽中的卡牌數(shù)量小于等于 3 張,一種是當(dāng)前卡牌槽中的卡牌數(shù)量大于 3 張。

上方圖示的就是這兩種情況,第二種情況(牌數(shù)多余于3 張)需要多處理一步,將剩余牌的位置向前調(diào)整。

接著,我們直接來(lái)看一下具體的實(shí)現(xiàn)吧!

首先,新增的兩個(gè)新的全局變量

移出卡牌的數(shù)量:記錄的是當(dāng)前需要移出幾張卡牌,如果卡槽中只有兩張牌,那么移出卡牌的數(shù)量就是 2,如果卡槽中超過(guò)三張牌,那么數(shù)量就是 3。

移出卡牌的位置:記錄當(dāng)前移出的卡牌的位置,因?yàn)樽疃嘀挥腥龔堃瞥隹ㄅ疲赃@個(gè)位置記錄的是1,2 或者 3。

新增兩個(gè)通知

移出卡牌位置調(diào)整:移出卡牌后,通知剩余的卡牌進(jìn)行位置調(diào)整。

移出插槽卡牌:通知插槽中的卡牌進(jìn)行移出處理。

接著看一下,在場(chǎng)景中我們?cè)黾恿藘蓚€(gè)新的資源。

一個(gè)是移出道具的按鈕(這里我使用了容器來(lái)制作按鈕),另一個(gè)是“移出卡牌”,這里我們單獨(dú)創(chuàng)建了一個(gè)新的“移出卡牌”精靈,它專(zhuān)門(mén)負(fù)責(zé)處理移出卡牌的功能和邏輯。

還記得之前講過(guò)的職責(zé)分離嗎?我們創(chuàng)建了“卡牌”和“插槽卡牌”,“卡牌”負(fù)責(zé)在堆疊布局中展示和拾取,“插槽卡牌”負(fù)責(zé)處理拾取后卡牌的放置,消除,位置調(diào)整等等,它們各自只需要負(fù)責(zé)處理自己的事情,這里我們創(chuàng)建一個(gè)新的“移出卡牌”也是同樣的道理,它只需要負(fù)責(zé)處理移出卡牌的邏輯即可。

來(lái)看一下具體的實(shí)現(xiàn)邏輯,首先是“移出道具按鈕”上的積木邏輯。

接著來(lái)看一下“移出卡牌”上的積木邏輯。

“移出卡牌”上需要處理的邏輯只有兩部分,一部分是被創(chuàng)建出來(lái)之后,先把自己放在卡牌槽中的對(duì)應(yīng)牌的位置上,然后再使用一個(gè)動(dòng)畫(huà)積木讓自己移動(dòng)到卡牌槽上方的指定位置上。

“移出卡牌”的拾取邏輯與“卡牌”的拾取邏輯類(lèi)似,創(chuàng)建一個(gè)新的“插槽卡牌”,然后把自己刪除掉。

最后,再來(lái)看一下插槽卡牌中的新增的兩個(gè)通知處理。

預(yù)覽一下,看看移出道具的效果。

當(dāng)卡牌槽中牌的數(shù)量不足三張的時(shí)候,直接將所有的牌移出放置到上方,當(dāng)超過(guò)三張的時(shí)候,移出前三張,然后調(diào)整剩余牌的位置。移出的牌在需要的時(shí)候可以再次選擇加入到卡牌槽中。

撤回一步

這個(gè)道具跟我們電腦上常用回退操作(Ctrl Z )有點(diǎn)兒像,其實(shí)就是將上一步拾取到卡槽中的牌退回到它之前在上方堆疊布局中的位置。這個(gè)撤回道具只能回退一步,不能夠進(jìn)行多次的回退。

這個(gè)好像沒(méi)有什么理論可講的,我們就直接來(lái)看它的具體實(shí)現(xiàn)吧!

首先,還是新增一些變量。

撤回卡牌:用于判斷當(dāng)前創(chuàng)建的卡牌是否是需要撤回的卡牌;

撤回卡牌行/列號(hào):記錄上一步拾取的卡牌的行列號(hào);

撤回卡牌層級(jí):記錄上一步拾取的卡牌的層級(jí);

撤回卡牌類(lèi)型:記錄上一步拾取的卡牌的類(lèi)型;

撤回卡牌插槽位置:記錄上一步加入到卡槽中的牌在卡槽中的位置;

這一系列撤回變量的作用其實(shí)就是記錄上一步操作的那張牌的各種信息,因?yàn)橹荒芑赝艘徊剑晕覀冎恍枰涗浬弦粡埮频男畔⒓纯伞S辛诉@些信息,就能夠創(chuàng)建出上一張牌了。

新建兩個(gè)新的通知。

撤回卡牌:用于向卡槽中的所有的牌發(fā)送通知,讓上一步插入進(jìn)來(lái)的牌撤回。

撤回卡牌位置調(diào)整:撤回之后,卡槽中剩余的牌需要進(jìn)行位置的調(diào)整。

在場(chǎng)景中新增一個(gè)“撤回一步按鈕”。

來(lái)看一下“撤回一步按鈕”上的積木邏輯。

邏輯看上去很的簡(jiǎn)單,不過(guò)有個(gè)地方需要注意一下,在一張卡牌被撤回之后,需要刷新一次所有卡牌的狀態(tài),因?yàn)橛锌赡艹霈F(xiàn)這種情況,例如拾取了一張第二層的牌,這個(gè)牌被拾取后,它下方第一層的牌變成了可拾取狀態(tài),此時(shí)如果使用了撤回操作,那這張牌會(huì)回到原來(lái)的位置上,那它下方的那張牌就應(yīng)該再次變成不可拾取狀態(tài),所以在撤回操作之后,我們需要重新計(jì)算所有牌的狀態(tài)。

這里通過(guò)“撤回卡牌插槽位置”這個(gè)變量是否大于 0 ,來(lái)判斷當(dāng)前是否有需要撤回的牌。什么情況下沒(méi)有要撤回的牌呢?一種是已經(jīng)撤回了一次了,就不能再撤回了,另一種是拾取的牌產(chǎn)生消除了,此時(shí)也沒(méi)有要撤回的牌了(因?yàn)橐呀?jīng)消除掉了)。

接著,來(lái)看“插槽卡牌”上新增的兩個(gè)通知處理。

再來(lái)看一下“卡牌”上的一些積木邏輯的修改。

“卡牌”被克隆出來(lái)時(shí)的積木邏輯修改:

這里主要根據(jù)當(dāng)前創(chuàng)建的是否是要撤回的卡牌來(lái)使用不同的邏輯,關(guān)卡初始時(shí)創(chuàng)建的卡牌依舊使用原來(lái)的邏輯,對(duì)于要撤回的卡牌,使用撤回變量中的數(shù)據(jù)進(jìn)行設(shè)置。

“卡牌”點(diǎn)擊時(shí)的積木邏輯修改:

紅線框出的為增加的積木邏輯,即每次從上方拾取卡牌的時(shí)候,就記錄這張卡牌的信息,所以這些撤回變量里記錄的永遠(yuǎn)都是上一張卡牌的信息。

最后,在“插槽卡牌”的克隆邏輯中也需要做一點(diǎn)兒修改。

只增加了一個(gè)積木塊,用于記錄要撤回的卡牌在插槽中的位置。

預(yù)覽一下,看看撤回道具的效果。

總是會(huì)撤回最后一次拾取的牌,并且在撤回之后,所有的牌的拾取狀態(tài)會(huì)自動(dòng)更新。

隨機(jī)打亂順序

這個(gè)道具的作用是將當(dāng)前的所有卡牌的順序隨機(jī)的進(jìn)行打亂,在沒(méi)有可消除的牌時(shí),進(jìn)行隨機(jī)打亂后或許就會(huì)出現(xiàn)轉(zhuǎn)機(jī)。

這個(gè)功能如何實(shí)現(xiàn)呢?來(lái)看一下下方的這張圖:

注意圖中的數(shù)字代表的是牌的位置編號(hào),而不是牌的類(lèi)型,這里我們將牌的位置(行號(hào),列號(hào),層級(jí))抽象成一個(gè)數(shù)字,方便理解整個(gè)隨機(jī)打亂的過(guò)程。

在隨機(jī)打亂之前,卡牌按照順序排列,將所有卡牌的位置編號(hào)添加到一個(gè)列表中,將這個(gè)列表進(jìn)行隨機(jī)的打亂,就能夠得到一個(gè)亂序的列表,然后從第一項(xiàng)開(kāi)始,將新列表的位置依次的設(shè)置到卡牌的位置中,得到的就是下方的隨機(jī)打亂后的卡牌位置,最后再將這些卡牌按照設(shè)置的位置重新進(jìn)行排列。

最后的調(diào)整過(guò)程看起來(lái)應(yīng)該是這樣的。

最后在重新調(diào)整后的卡牌中,第 1 張卡牌其實(shí)是原來(lái)位于位置 5 上的卡牌。

以上就是隨機(jī)打亂的實(shí)現(xiàn)思路了,就是將所有卡牌的位置進(jìn)行隨機(jī)的互換,讓我們到微信小游戲制作工具中實(shí)現(xiàn)一下吧!

增加一個(gè)新的全局變量

當(dāng)前隨機(jī)打亂層級(jí):記錄當(dāng)前要進(jìn)行位置調(diào)整的是哪一層的卡牌。

增加四個(gè)新的列表

卡牌行/列號(hào)列表:記錄所有卡牌的行號(hào)和列號(hào);

卡牌層級(jí)列表:記錄所有卡牌的層級(jí),即位于第幾層;

隨機(jī)亂序列表:用于生成隨機(jī)打亂順序的列表;

上方我們講過(guò)的使用一個(gè)數(shù)字表示卡牌位置,是對(duì)位置進(jìn)行了簡(jiǎn)化處理,方便理解。實(shí)際游戲中,每張卡牌的位置由行號(hào),列號(hào),層級(jí)三部分組成,所以這里需要三個(gè)列表來(lái)分別記錄位置信息。

新增 3 個(gè)通知

記錄卡牌位置:通知所有的卡牌將自己的位置信息記錄到列表中;

隨機(jī)設(shè)置卡牌位置:通知所有卡牌將打亂順序后的位置依次設(shè)置到卡牌的位置信息中;

隨機(jī)打亂卡牌:通知所有卡牌調(diào)整自己的位置到之前設(shè)置的位置上;

接著,在場(chǎng)景中,新增一個(gè)“隨機(jī)打亂按鈕”。

來(lái)看一下“隨機(jī)打亂按鈕”上的積木邏輯。

這里注意“隨機(jī)亂序列表”的使用,我們使用了三個(gè)列表來(lái)記錄卡牌的位置信息,這三個(gè)列表是不能隨機(jī)打亂順序的,因?yàn)樾刑?hào)列表中的第 n 項(xiàng),列號(hào)列表中的第 n 項(xiàng),層級(jí)列表中的第 n 項(xiàng),這三個(gè)數(shù)值決定了一張卡牌的位置,這三個(gè)列表中的項(xiàng)必須是一一對(duì)應(yīng)的。所以這里我們使用了第四個(gè)列表,即“隨機(jī)亂序列表”,這個(gè)列表中存放就是卡牌的位置編號(hào),每個(gè)位置編號(hào)只需要一個(gè)數(shù)字即可(這個(gè)跟我們前面講過(guò)的對(duì)上了),假如當(dāng)前共有 5 張卡牌,那我們就生成一個(gè) [1,2,3,4,5] 的列表,將這個(gè)列表隨機(jī)打亂順序 [3,5,2,1,4],然后將新的位置依次的設(shè)置到卡牌中。

如何通過(guò)一個(gè)數(shù)字位置編號(hào),獲取到包含三個(gè)信息的卡牌位置呢?假如說(shuō)當(dāng)前卡牌的位置編號(hào)為 1 ,那么就可以通過(guò)“卡牌行號(hào)列表的第 1 項(xiàng)”得到行號(hào),“卡牌列號(hào)列表的第 1 項(xiàng)”得到列號(hào),“卡牌層級(jí)列表的第 1 項(xiàng)”得到層級(jí)。

另外一點(diǎn)兒需要注意的是在最后調(diào)整卡牌位置的時(shí)候,我們是一層一層調(diào)整的,即先調(diào)整第一層的卡牌,然后再調(diào)整第二層的卡牌。為什么這么做呢?因?yàn)榭ㄅ茍D片是有層級(jí)順序的,要確保第二層卡牌圖片的層級(jí)位于第一層卡牌之上,這樣才能讓第二層卡牌顯示在第一層卡牌的上面。所以這里我們先從下層調(diào)整,然后再調(diào)整上面的一層,這樣就能保證卡牌圖片層級(jí)的正確顯示了。

接著,再來(lái)看一下“卡牌”上新增的三個(gè)通知的處理。

記錄卡牌位置通知的處理:

隨機(jī)設(shè)置卡牌位置通知的處理:

隨機(jī)打亂卡牌通知的處理:

注意這里使用了“將自己的層級(jí)移至最上層”積木,這個(gè)積木塊的作用是將當(dāng)前精靈的圖層移動(dòng)到最上方,前面講過(guò)我們是一層一層的進(jìn)行調(diào)整的,調(diào)整第一層時(shí),第一層卡牌圖片的層級(jí)位于最上層,接著調(diào)整第二層,此時(shí),第二層卡牌圖片的層級(jí)位于最上層了(第一層卡牌之上),然后以此類(lèi)推,即使你有 n 層卡牌,這些卡牌圖片的顯示順序也會(huì)是一層一層的正確顯示的。

最后,我們來(lái)預(yù)覽一下這個(gè)隨機(jī)打亂道具的效果。

至此,羊了個(gè)羊游戲系列教程就結(jié)束了。對(duì)不少人講,學(xué)習(xí)這個(gè)系列教程有些困難。但是如果你能硬著頭皮堅(jiān)持下來(lái),再回過(guò)頭來(lái)看看,一定會(huì)發(fā)現(xiàn)自己收獲了很多。

在這四節(jié)教程中,我們把羊了個(gè)羊這種三消游戲包含的所有內(nèi)容基本上都講全了,也就是說(shuō)你現(xiàn)在已經(jīng)掌握了足夠的技巧和方法了,對(duì)于這樣的一個(gè)消除游戲,接下來(lái)怎么做,是增加更多的層數(shù),還是增加更多的關(guān)卡,亦或者融合進(jìn)一些你自己的想法......你已經(jīng)具備了足夠的能力來(lái)做這些事情,所以到底要怎樣做,就要看你了。

“師傅領(lǐng)進(jìn)門(mén),修行在個(gè)人 ”這句俗語(yǔ)還是很有道理的,你要做的游戲,或者要做的事不可能永遠(yuǎn)有教程,或者有人能引領(lǐng),大部分時(shí)候,我們終歸還是要一個(gè)人摸索著前行的。


歡迎關(guān)注小螞蟻的微信公眾號(hào)【小螞蟻教你做游戲】,學(xué)習(xí)更多游戲開(kāi)發(fā)原創(chuàng)教程。

標(biāo)簽: 來(lái)看一下 位置調(diào)整

上一篇:世界熱門(mén):前端性能優(yōu)化,壓縮包體積、提升打包速度
下一篇:Nginx與LUA(2)