本文首發于公衆号【小螞蟻教你做遊戲】,歡迎關注,學習更多遊戲開發原創教程。
嗨!大家好,我是小螞蟻。
今天是羊了個羊系列教程的最後一節,我們來學習一下遊戲中的三種道具的實現。
這三種道具分别是:移出三張牌,撤回一步,随機打亂順序。
接下來,我們就依次來看一下每種道具的具體實現。
移出三張卡牌這個道具的作用是從當前的卡牌槽中移出前三張牌,把它們暫時放在卡牌槽的上方,移出的牌可以在後續再次加入到卡牌槽中。
使用移出道具時,有可能會出現兩種情況。一種是當前卡牌槽中的卡牌數量小于等于 3 張,一種是當前卡牌槽中的卡牌數量大于 3 張。
上方圖示的就是這兩種情況,第二種情況(牌數多餘于3 張)需要多處理一步,将剩餘牌的位置向前調整。
接着,我們直接來看一下具體的實現吧!
首先,新增的兩個新的全局變量。
移出卡牌的數量:記錄的是當前需要移出幾張卡牌,如果卡槽中隻有兩張牌,那麼移出卡牌的數量就是 2,如果卡槽中超過三張牌,那麼數量就是 3。
移出卡牌的位置:記錄當前移出的卡牌的位置,因為最多隻有三張移出卡牌,所以這個位置記錄的是1,2 或者 3。
新增兩個通知。
移出卡牌位置調整:移出卡牌後,通知剩餘的卡牌進行位置調整。
移出插槽卡牌:通知插槽中的卡牌進行移出處理。
接着看一下,在場景中我們增加了兩個新的資源。
一個是移出道具的按鈕(這裡我使用了容器來制作按鈕),另一個是“移出卡牌”,這裡我們單獨創建了一個新的“移出卡牌”精靈,它專門負責處理移出卡牌的功能和邏輯。
還記得之前講過的職責分離嗎?我們創建了“卡牌”和“插槽卡牌”,“卡牌”負責在堆疊布局中展示和拾取,“插槽卡牌”負責處理拾取後卡牌的放置,消除,位置調整等等,它們各自隻需要負責處理自己的事情,這裡我們創建一個新的“移出卡牌”也是同樣的道理,它隻需要負責處理移出卡牌的邏輯即可。
來看一下具體的實現邏輯,首先是“移出道具按鈕”上的積木邏輯。
接着來看一下“移出卡牌”上的積木邏輯。
“移出卡牌”上需要處理的邏輯隻有兩部分,一部分是被創建出來之後,先把自己放在卡牌槽中的對應牌的位置上,然後再使用一個動畫積木讓自己移動到卡牌槽上方的指定位置上。
“移出卡牌”的拾取邏輯與“卡牌”的拾取邏輯類似,創建一個新的“插槽卡牌”,然後把自己删除掉。
最後,再來看一下插槽卡牌中的新增的兩個通知處理。
預覽一下,看看移出道具的效果。
當卡牌槽中牌的數量不足三張的時候,直接将所有的牌移出放置到上方,當超過三張的時候,移出前三張,然後調整剩餘牌的位置。移出的牌在需要的時候可以再次選擇加入到卡牌槽中。
撤回一步這個道具跟我們電腦上常用回退操作(Ctrl Z )有點兒像,其實就是将上一步拾取到卡槽中的牌退回到它之前在上方堆疊布局中的位置。這個撤回道具隻能回退一步,不能夠進行多次的回退。
這個好像沒有什麼理論可講的,我們就直接來看它的具體實現吧!
首先,還是新增一些變量。
撤回卡牌:用于判斷當前創建的卡牌是否是需要撤回的卡牌;
撤回卡牌行/列号:記錄上一步拾取的卡牌的行列号;
撤回卡牌層級:記錄上一步拾取的卡牌的層級;
撤回卡牌類型:記錄上一步拾取的卡牌的類型;
撤回卡牌插槽位置:記錄上一步加入到卡槽中的牌在卡槽中的位置;
這一系列撤回變量的作用其實就是記錄上一步操作的那張牌的各種信息,因為隻能回退一步,所以我們隻需要記錄上一張牌的信息即可。有了這些信息,就能夠創建出上一張牌了。
新建兩個新的通知。
撤回卡牌:用于向卡槽中的所有的牌發送通知,讓上一步插入進來的牌撤回。
撤回卡牌位置調整:撤回之後,卡槽中剩餘的牌需要進行位置的調整。
在場景中新增一個“撤回一步按鈕”。
來看一下“撤回一步按鈕”上的積木邏輯。
邏輯看上去很的簡單,不過有個地方需要注意一下,在一張卡牌被撤回之後,需要刷新一次所有卡牌的狀态,因為有可能出現這種情況,例如拾取了一張第二層的牌,這個牌被拾取後,它下方第一層的牌變成了可拾取狀态,此時如果使用了撤回操作,那這張牌會回到原來的位置上,那它下方的那張牌就應該再次變成不可拾取狀态,所以在撤回操作之後,我們需要重新計算所有牌的狀态。
這裡通過“撤回卡牌插槽位置”這個變量是否大于 0 ,來判斷當前是否有需要撤回的牌。什麼情況下沒有要撤回的牌呢?一種是已經撤回了一次了,就不能再撤回了,另一種是拾取的牌産生消除了,此時也沒有要撤回的牌了(因為已經消除掉了)。
接着,來看“插槽卡牌”上新增的兩個通知處理。
再來看一下“卡牌”上的一些積木邏輯的修改。
“卡牌”被克隆出來時的積木邏輯修改:
這裡主要根據當前創建的是否是要撤回的卡牌來使用不同的邏輯,關卡初始時創建的卡牌依舊使用原來的邏輯,對于要撤回的卡牌,使用撤回變量中的數據進行設置。
“卡牌”點擊時的積木邏輯修改:
紅線框出的為增加的積木邏輯,即每次從上方拾取卡牌的時候,就記錄這張卡牌的信息,所以這些撤回變量裡記錄的永遠都是上一張卡牌的信息。
最後,在“插槽卡牌”的克隆邏輯中也需要做一點兒修改。
隻增加了一個積木塊,用于記錄要撤回的卡牌在插槽中的位置。
預覽一下,看看撤回道具的效果。
總是會撤回最後一次拾取的牌,并且在撤回之後,所有的牌的拾取狀态會自動更新。
随機打亂順序這個道具的作用是将當前的所有卡牌的順序随機的進行打亂,在沒有可消除的牌時,進行随機打亂後或許就會出現轉機。
這個功能如何實現呢?來看一下下方的這張圖:
注意圖中的數字代表的是牌的位置編号,而不是牌的類型,這裡我們将牌的位置(行号,列号,層級)抽象成一個數字,方便理解整個随機打亂的過程。
在随機打亂之前,卡牌按照順序排列,将所有卡牌的位置編号添加到一個列表中,将這個列表進行随機的打亂,就能夠得到一個亂序的列表,然後從第一項開始,将新列表的位置依次的設置到卡牌的位置中,得到的就是下方的随機打亂後的卡牌位置,最後再将這些卡牌按照設置的位置重新進行排列。
最後的調整過程看起來應該是這樣的。
最後在重新調整後的卡牌中,第 1 張卡牌其實是原來位于位置 5 上的卡牌。
以上就是随機打亂的實現思路了,就是将所有卡牌的位置進行随機的互換,讓我們到微信小遊戲制作工具中實現一下吧!
增加一個新的全局變量。
當前随機打亂層級:記錄當前要進行位置調整的是哪一層的卡牌。
增加四個新的列表。
卡牌行/列号列表:記錄所有卡牌的行号和列号;
卡牌層級列表:記錄所有卡牌的層級,即位于第幾層;
随機亂序列表:用于生成随機打亂順序的列表;
上方我們講過的使用一個數字表示卡牌位置,是對位置進行了簡化處理,方便理解。實際遊戲中,每張卡牌的位置由行号,列号,層級三部分組成,所以這裡需要三個列表來分别記錄位置信息。
新增 3 個通知。
記錄卡牌位置:通知所有的卡牌将自己的位置信息記錄到列表中;
随機設置卡牌位置:通知所有卡牌将打亂順序後的位置依次設置到卡牌的位置信息中;
随機打亂卡牌:通知所有卡牌調整自己的位置到之前設置的位置上;
接着,在場景中,新增一個“随機打亂按鈕”。
來看一下“随機打亂按鈕”上的積木邏輯。
這裡注意“随機亂序列表”的使用,我們使用了三個列表來記錄卡牌的位置信息,這三個列表是不能随機打亂順序的,因為行号列表中的第 n 項,列号列表中的第 n 項,層級列表中的第 n 項,這三個數值決定了一張卡牌的位置,這三個列表中的項必須是一一對應的。所以這裡我們使用了第四個列表,即“随機亂序列表”,這個列表中存放就是卡牌的位置編号,每個位置編号隻需要一個數字即可(這個跟我們前面講過的對上了),假如當前共有 5 張卡牌,那我們就生成一個 [1,2,3,4,5] 的列表,将這個列表随機打亂順序 [3,5,2,1,4],然後将新的位置依次的設置到卡牌中。
如何通過一個數字位置編号,獲取到包含三個信息的卡牌位置呢?假如說當前卡牌的位置編号為 1 ,那麼就可以通過“卡牌行号列表的第 1 項”得到行号,“卡牌列号列表的第 1 項”得到列号,“卡牌層級列表的第 1 項”得到層級。
另外一點兒需要注意的是在最後調整卡牌位置的時候,我們是一層一層調整的,即先調整第一層的卡牌,然後再調整第二層的卡牌。為什麼這麼做呢?因為卡牌圖片是有層級順序的,要确保第二層卡牌圖片的層級位于第一層卡牌之上,這樣才能讓第二層卡牌顯示在第一層卡牌的上面。所以這裡我們先從下層調整,然後再調整上面的一層,這樣就能保證卡牌圖片層級的正确顯示了。
接着,再來看一下“卡牌”上新增的三個通知的處理。
記錄卡牌位置通知的處理:
随機設置卡牌位置通知的處理:
随機打亂卡牌通知的處理:
注意這裡使用了“将自己的層級移至最上層”積木,這個積木塊的作用是将當前精靈的圖層移動到最上方,前面講過我們是一層一層的進行調整的,調整第一層時,第一層卡牌圖片的層級位于最上層,接着調整第二層,此時,第二層卡牌圖片的層級位于最上層了(第一層卡牌之上),然後以此類推,即使你有 n 層卡牌,這些卡牌圖片的顯示順序也會是一層一層的正确顯示的。
最後,我們來預覽一下這個随機打亂道具的效果。
至此,羊了個羊遊戲系列教程就結束了。對不少人講,學習這個系列教程有些困難。但是如果你能硬着頭皮堅持下來,再回過頭來看看,一定會發現自己收獲了很多。
在這四節教程中,我們把羊了個羊這種三消遊戲包含的所有内容基本上都講全了,也就是說你現在已經掌握了足夠的技巧和方法了,對于這樣的一個消除遊戲,接下來怎麼做,是增加更多的層數,還是增加更多的關卡,亦或者融合進一些你自己的想法......你已經具備了足夠的能力來做這些事情,所以到底要怎樣做,就要看你了。
“師傅領進門,修行在個人 ”這句俗語還是很有道理的,你要做的遊戲,或者要做的事不可能永遠有教程,或者有人能引領,大部分時候,我們終歸還是要一個人摸索着前行的。
,