全球快訊:如何制作一個(gè)羊了個(gè)羊游戲5:快速拾取

2023-01-13 17:22:31 來源:51CTO博客

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

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


【資料圖】

之前我們實(shí)現(xiàn)的游戲中,圖標(biāo)的拾取是有時(shí)間間隔的。

如圖,每個(gè)圖標(biāo)的拾取之間有一定的時(shí)間間隔,這就意味著如果玩家快速的點(diǎn)擊圖標(biāo),這些在時(shí)間間隔之內(nèi)被點(diǎn)擊的圖標(biāo)是沒有反應(yīng)的。這是一種很不好的體驗(yàn),因?yàn)橥婕倚枰却螒颉?/p>

對于玩家來講,自己的操作是不會(huì)有問題的,所有的問題都是游戲的問題。我們作為游戲開發(fā)者應(yīng)該盡量避免讓玩家遇到這樣的情況。所以,這篇教程里,我們就來解決一下這個(gè)拾取時(shí)間間隔的問題。

想要解決一個(gè)問題,首先要弄清楚之所以出現(xiàn)這種問題的原因。

這里順便提一句,很多人都喜歡提問題,尤其是軟件或者游戲中出現(xiàn)的 bug。并不是所有的問題都能夠被找到被解決,對于開發(fā)人員來講哪些是能夠被解決的問題呢?在特定的情境下可以重復(fù)出現(xiàn)的問題,一個(gè)問題只要在固定的情境下能夠重復(fù)出現(xiàn),這種問題就一定能夠排查出原因,只要找到原因的大概率都是能解決的。如果一個(gè)問題只是偶爾出現(xiàn),無法進(jìn)行復(fù)現(xiàn),這樣的問題是很難解決的。

來看一下卡牌無法快速連續(xù)拾取的原因。

如圖,是卡牌拾取的積木邏輯,這里在執(zhí)行拾取邏輯之前,先進(jìn)行了一個(gè)判斷,判斷當(dāng)前是否可操作,如果可以操作的話,才執(zhí)行卡牌的拾取邏輯。如果當(dāng)前的卡牌可以操作,則在進(jìn)行卡牌拾取的時(shí)候,將“是否可操作”的全局變量設(shè)置為 0 ,即不可操作。所以在這個(gè)變量變?yōu)?1 之前,所有點(diǎn)擊的卡牌都不會(huì)被拾取到。這個(gè)就是無法快速拾取卡牌的原因了。

那“是否可操作”變量是什么時(shí)候被重新設(shè)置為 1 的呢?

在卡牌槽上的消除計(jì)算邏輯中,當(dāng)所有的處理(卡牌插入卡槽,卡槽中的卡牌移動(dòng),卡牌消除,消除后位置調(diào)整)結(jié)束之后,可操作被設(shè)置為 1,才能夠去拾取下一張牌。可見,如果一張牌拾取之后滿足消除條件,進(jìn)行消除操作,整個(gè)等待的時(shí)間還是很長的。

問題的原因找到了,下面我們來看一下如何解決這個(gè)問題。想要快速連續(xù)的進(jìn)行拾取操作,這個(gè)“是否可操作”變量置 1 的邏輯就要提前進(jìn)行,最好是一張牌拾取完成之后,變量就立刻設(shè)置為 1,這樣下一張牌就能再次拾取了。

但是,想要將“可操作”提前,并不是將這塊積木放到前面就行了,我們還需要考慮卡牌的拾取的操作回合。

如圖,是一個(gè)卡牌拾取的完整回合,之前我們把“可操作”設(shè)置放到了一個(gè)操作回合結(jié)束之后進(jìn)行。現(xiàn)在我們要把這個(gè)設(shè)置提前,就需要考慮到整個(gè)流程,比如說當(dāng)你拾取下一張卡牌的時(shí)候,上一張卡牌卡牌還在進(jìn)行插入操作怎么辦?上一張卡牌正在進(jìn)行消除處理時(shí)怎么辦?卡槽中的卡牌正在進(jìn)行位置調(diào)整時(shí)怎么辦?

我們要找到一個(gè)合適的時(shí)機(jī),既要保證當(dāng)前拾取的牌能夠順利執(zhí)行完自己的操作回合,也要保證之前的牌能夠正確的執(zhí)行完它的操作回合。

下面我們對現(xiàn)有的邏輯進(jìn)行一點(diǎn)兒修改,將“可操作”設(shè)置提前。如果你一時(shí)看不懂也沒關(guān)系,先照著在項(xiàng)目中操作,然后再結(jié)合著項(xiàng)目中的積木邏輯嘗試?yán)斫狻?/p>

我們首先修改一下插槽卡牌的克隆邏輯。

如圖,我們做了兩處修改,一個(gè)是將消除計(jì)算的通知提前了,另一個(gè)是增加了可操作設(shè)置。注意,這里我們要首先判斷一下當(dāng)前卡牌槽的是否已滿(已有 7 張牌),如果是的話,就不能繼續(xù)進(jìn)行拾取操作了,因?yàn)樵偈叭】ㄅ凭统隹ú哿恕?/p>

現(xiàn)在我們可以連續(xù)甚至是以很快的速度點(diǎn)擊拾取圖標(biāo)了。但是注意觀察這里還是有一點(diǎn)兒問題的,比如說在三個(gè)猴子圖標(biāo)消除的時(shí)候,第三個(gè)猴子圖標(biāo)還沒有移動(dòng)到卡槽中,三個(gè)圖標(biāo)就消除了。

因?yàn)槲覀儗ⅰ跋?jì)算”提前了,所以現(xiàn)在的整個(gè)回合看起來像是這樣的。

如圖,現(xiàn)在拾取的卡牌移動(dòng)插入卡槽,卡槽中卡牌位置調(diào)整,以及消除判斷和處理是同步進(jìn)行的。所以當(dāng)有消除時(shí),卡牌還沒有移動(dòng)到卡槽中就被消除了。想要解決這個(gè)問題,我們要將卡牌的消除處理稍微延遲一點(diǎn)兒,要讓卡牌移動(dòng)到卡槽中之后,才進(jìn)行消除處理。

如何實(shí)現(xiàn)呢?這里可以使用一塊“等待某條件達(dá)成”的積木。

首先,我們修改一下插槽卡牌的克隆邏輯。

最后,我們在消除之前,增加一塊“等待某條件達(dá)成”的積木。

如圖,等待的條件就是“正在插牌”的這個(gè)全局變量的值變成 0(即當(dāng)前的牌已經(jīng)進(jìn)入到卡槽中了)。這個(gè)等待積木的作用是將積木邏輯暫停下來,一直到其中的條件達(dá)成之后,再繼續(xù)執(zhí)行下面的積木邏輯。

最后,再來看一下消除的效果。

消除處理會(huì)在牌達(dá)到卡槽之后進(jìn)行。

今天的內(nèi)容就到這里了,解決這個(gè)無法連續(xù)點(diǎn)擊的問題,從頭到尾我們增加和調(diào)整了也就是幾塊積木。也許你看過教程后,會(huì)恍然大悟,原來這么簡單就能解決了,為什么我就是想不到呢?

解決問題考驗(yàn)的是我們的分析能力,而分析能力又需要一個(gè)前提,那就是對于所做項(xiàng)目的足夠了解。即使你的邏輯分析能力再好,如果對于項(xiàng)目本身不熟悉的話,分析能力也是派不上用場的,這也就是為什么很多同學(xué)拿到一個(gè)別人的項(xiàng)目過來,完全不知道從何處下手的原因。

所有,我希望大家能夠自己動(dòng)手做,這是了解和熟悉一個(gè)項(xiàng)目的最好方法。只有具備足夠的了解,你的分析能力才能派上用場,當(dāng)你遇到問題時(shí),才能知道該去哪里排查原因,最終找到解決方法。

最終的修改和調(diào)整只不過是對分析結(jié)果的驗(yàn)證而已。


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

標(biāo)簽: 時(shí)間間隔 位置調(diào)整 全局變量

上一篇:世界熱消息:Python網(wǎng)絡(luò)編程之socket之send和recv原理剖析
下一篇:世界快消息!前端頁面加載速度優(yōu)化解決方案