本發(fā)明涉及基于cocos2d-x的移動游戲開發(fā)技術(shù),尤其涉及消除類游戲的開發(fā)及應(yīng)用。
背景技術(shù):
近年來,隨著智能移動終端的迅速普及,移動游戲市場規(guī)模也逐年擴(kuò)大。其中,消除類游戲的市場份額更是在所有游戲市場中占主導(dǎo)地位。越來越多的開發(fā)者開發(fā)了形態(tài)各異的消除類游戲,但本質(zhì)上的算法都是基本相同的。絕大多數(shù)開發(fā)者在開發(fā)過程中都是采用傳統(tǒng)的消除算法來控制游戲中所有元素對象的行為以及動畫效果。但利用該算法實現(xiàn)的消除游戲在玩家體驗效果上有較大的不足之處。
首先,在判定是否有元素可以消除的過程中,該算法必須對所有的游戲元素進(jìn)行消除判定,工作量較大。其次,在產(chǎn)生消除動作之后,該算法也必須為所有游戲元素計算其應(yīng)該在的坐標(biāo),隨后將元素移動至該坐標(biāo)上。該種方式在元素進(jìn)行斜掉(空白單元利用其斜上方的元素進(jìn)行補(bǔ)充)的動作上,只是單純的直接將元素從原始坐標(biāo)移動到目標(biāo)坐標(biāo)上,掉落的加速效果難以實現(xiàn),沒有逼真的掉落過程。而且對于一些特定場景消除后的掉落過程中,會出現(xiàn)不符合物理掉落規(guī)律的情況,且動畫銜接難度很大,降低玩家的游戲體驗。最后,對于游戲過程中的創(chuàng)建元素這一步驟,傳統(tǒng)的算法在檢測到消除之后的空白單元的個數(shù)之后,一次性創(chuàng)建相同個數(shù)的游戲元素,當(dāng)出現(xiàn)需要創(chuàng)建過多數(shù)量新游戲元素時,游戲可能會發(fā)生卡頓,影響游戲的流暢性。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的在于針對現(xiàn)有技術(shù)的不足,提供一種應(yīng)用于消除類游戲中的邊消邊掉方法。
本發(fā)明的目的是通過以下技術(shù)方案實現(xiàn)的:一種應(yīng)用于消除類游戲中的邊消邊掉方法,在消除類游戲中,當(dāng)游戲元素發(fā)生消除之后,留下的空白單元就會由其它元素掉落下來補(bǔ)充。該掉落方式主要分為三種:
正常掉落:空白單元正上方存在可以進(jìn)行掉落的游戲元素,控制該元素執(zhí)行掉落動作,補(bǔ)充空白單元。
頂?shù)簦寒?dāng)空白單元處于游戲界面的最頂部,正上方已經(jīng)不存在游戲元素時,將創(chuàng)建新的游戲元素進(jìn)行掉落補(bǔ)充。該種掉落補(bǔ)充方式即為頂?shù)簟?/p>
斜掉:斜掉出現(xiàn)在比較特定的場景中:
1.空白單元上方已經(jīng)不存在游戲元素且無法創(chuàng)建新的游戲元素進(jìn)行掉落補(bǔ)充。
2.空白單元上方的游戲元素?zé)o法移動即無法執(zhí)行掉落動作。
當(dāng)出現(xiàn)以上兩種場景之一時,系統(tǒng)將會控制空白單元左上方或者右上方的游戲元素進(jìn)行掉落補(bǔ)充。
考慮到以上三種掉落方式,本發(fā)明通過以下步驟實現(xiàn):
步驟1:創(chuàng)建所有元素,默認(rèn)所有元素處于完成掉落的狀態(tài);對每一個元素都設(shè)定兩個標(biāo)志位a,b用于標(biāo)志元素此時所處的狀態(tài)。
a:該標(biāo)志位表明元素對象是否為剛剛掉落,a=1代表元素對象處于剛剛掉落狀態(tài);a=0代表元素對象不是剛剛掉落的狀態(tài)。
b:該標(biāo)志位只有當(dāng)元素對象不是剛剛掉落(a=0)時才起作用:b=1代表元素對象處于完成掉落的狀態(tài);b=0代表元素對象處于正在掉落的狀態(tài)。
步驟2:根據(jù)玩家的操作移動元素,判斷被移動的元素對象周圍是否產(chǎn)生消除動作,若可消除,則執(zhí)行消除動作。
步驟3:對元素對象進(jìn)行實時檢測,在每一幀時間里做一次如下循環(huán)過程:
(1)遍歷所有元素,找到標(biāo)志位b的值為0的元素,獲取該元素的當(dāng)前坐標(biāo),判斷該元素是否到達(dá)其目標(biāo)坐標(biāo)。若已經(jīng)到達(dá),則將該元素的標(biāo)志位a置為1,代表其剛剛掉落;反之則不進(jìn)行任何操作。
(2)遍歷所有元素找出空白單元(已消除部分),使得其上方元素(正常掉落過程)或者是斜上方元素(斜掉過程)或者是新創(chuàng)建的元素(頂?shù)暨^程)進(jìn)行掉落動作,且將空白單元所在的位置設(shè)定為該游戲元素掉落的目標(biāo)坐標(biāo)。若該掉落元素狀態(tài)標(biāo)志位a=1,則先將該標(biāo)志位置為0,然后將標(biāo)志位b置為0;若該元素標(biāo)志位a=0,則直接將標(biāo)志位b置為0表示該元素處于正在掉落狀態(tài)。
(3)對剛剛掉落狀態(tài)標(biāo)志位a=1的元素進(jìn)行消除判定,即判斷該元素能否與周圍的元素產(chǎn)生消除動作:若能,則執(zhí)行消除動作,消除該元素所有屬性并釋放;若不能,則將該元素狀態(tài)位a置為0,狀態(tài)位b置為1表示該元素已經(jīng)處于完成掉落的狀態(tài)。
(4)直到所有元素的標(biāo)志位都是b=1,退出該循環(huán)過程。
步驟4:根據(jù)玩家的操作行為重新回到步驟2以及步驟3進(jìn)行循環(huán)檢測。
本發(fā)明方法實現(xiàn)了游戲元素一邊消除一邊掉落的效果,使得游戲畫面更加順暢,增強(qiáng)動畫的流暢感。而且游戲元素消除與掉落兩者的動畫效果疊加,使得游戲畫面更加酷炫,增強(qiáng)玩家游戲體驗。且與傳統(tǒng)的消除方法相比,本發(fā)明方法具有如下優(yōu)勢:
1.增加了遍歷元素的頻率,但在每次遍歷元素之后,只需要針對每次極少量的元素進(jìn)行深層次的判定,判定其是否可以掉落或者是否可以產(chǎn)生消除動作等,減少了單次的工作量。
2.邏輯劃分更為細(xì)致,對于游戲中后續(xù)出現(xiàn)的一些特殊場景或者特殊元素的消除效果(如直線消的效果等)更加易于實現(xiàn)。
3.針對游戲過程中的創(chuàng)建元素這一步驟,傳統(tǒng)的算法是檢測到消除之后的空白單元的個數(shù)之后,一次性創(chuàng)建相同個數(shù)的游戲元素。而本發(fā)明邊消邊掉方法則是只有游戲坐標(biāo)的頂部出現(xiàn)空白單元需要元素掉落補(bǔ)充(頂?shù)?的時候才創(chuàng)建新的游戲元素,這就將創(chuàng)建新游戲元素的過程分為幾個小步驟,減少每次創(chuàng)建的新游戲元素的數(shù)量,降低由于一次性創(chuàng)建過多新元素導(dǎo)致游戲卡頓的可能性。
4.對于傳統(tǒng)算法在斜掉過程中出現(xiàn)的掉落動畫效果不理想的問題,本發(fā)明邊消邊掉方法所控制的游戲元素掉落動畫在所有場景下都能切實模擬物體在實際物理系統(tǒng)中的掉落過程,動畫效果流暢感更好,在優(yōu)化玩家游戲體驗的同時,大幅降低了后續(xù)一些特定消除效果的實現(xiàn)難度。
附圖說明
圖1是本發(fā)明方法的基本流程圖。
具體實施方式
下面結(jié)合附圖對本發(fā)明作進(jìn)一步說明。
首先針對圖1中出現(xiàn)的游戲元素的狀態(tài)做簡要說明,游戲中的所有元素總共分為三種狀態(tài):
正在掉落狀態(tài):表示元素正在執(zhí)行從其原始坐標(biāo)移動到其目標(biāo)坐標(biāo)(原始坐標(biāo)下方的空白單元)的掉落動作,即在算法每一幀的檢測中,該元素還在移動過程中,并未到達(dá)其目標(biāo)坐標(biāo)。游戲中,只對該狀態(tài)的元素進(jìn)行實時坐標(biāo)檢測。
剛剛掉落狀態(tài):表示元素剛剛執(zhí)行完畢一個掉落動作,即在算法每一幀的實時檢測中,檢測到正在掉落狀態(tài)的游戲元素已經(jīng)到達(dá)其目標(biāo)坐標(biāo),則將該元素標(biāo)記為剛剛掉落狀態(tài),并立即對它進(jìn)行消除判定,若無法消除,則會將該元素標(biāo)記為完全掉落狀態(tài),所以剛剛掉落狀態(tài)是一個瞬時狀態(tài)。算法每一幀循環(huán)中的消除判定也只作用于當(dāng)前幀下具有該狀態(tài)的元素。
完成掉落狀態(tài):經(jīng)過消除判定之后無法進(jìn)行消除的元素,且其坐標(biāo)下方也沒有空白單元時就處于完成掉落狀態(tài)。在每一幀的循環(huán)里,算法對該狀態(tài)下的元素不進(jìn)行檢測。只有當(dāng)該元素下方出現(xiàn)空白單元需要其進(jìn)行掉落了,元素狀態(tài)才會發(fā)生改變。
下面結(jié)合附圖對本發(fā)明方法的具體實施步驟做詳細(xì)說明:
如圖1所示,針對玩家進(jìn)行一次操作,實施以下幾個步驟:
步驟1:創(chuàng)建所有元素,默認(rèn)所有元素處于完成掉落的狀態(tài)。
步驟2:對每一個元素都設(shè)定兩個標(biāo)志位a,b用于標(biāo)志元素此時所處的狀態(tài)。
a:該標(biāo)志位表明元素對象是否為剛剛掉落,a=1代表元素對象處于剛剛掉落狀態(tài);a=0代表元素對象不是剛剛掉落的狀態(tài)。
b:該標(biāo)志位只有當(dāng)元素對象不是剛剛掉落(a=0)時才起作用:b=1代表元素對象處于完成掉落的狀態(tài);b=0代表元素對象處于正在掉落的狀態(tài)。
步驟3:根據(jù)玩家的動作調(diào)換兩個元素的坐標(biāo)位置,判斷被移動的元素對象周圍是否產(chǎn)生消除動作,若可消除,則執(zhí)行消除動作。若不可消除,則將兩個元素坐標(biāo)調(diào)換回來,等待下一次的玩家操作。
步驟4:對元素對象進(jìn)行實時檢測,在每一幀時間里完成一次如下循環(huán)過程:
(1)遍歷所有元素,找到標(biāo)志位b的值為0的元素,獲取該元素的當(dāng)前坐標(biāo),判斷該元素是否到達(dá)其目標(biāo)坐標(biāo)。若已經(jīng)到達(dá),則將該元素的標(biāo)志位a置為1,代表其剛剛掉落;反之則不進(jìn)行任何操作。
(2)遍歷所有元素找出空白單元(已消除部分),使得其上方元素(正常掉落過程)或者是斜上方元素(斜掉過程)或者是新創(chuàng)建的元素(頂?shù)暨^程)進(jìn)行掉落,且將空白單元所在的位置設(shè)定為該游戲元素掉落的目標(biāo)坐標(biāo)。若該掉落元素狀態(tài)標(biāo)志位a=1,則先將該標(biāo)志位置為0,然后將標(biāo)志位b置為0;若該元素標(biāo)志位a=0,則直接將標(biāo)志位b置為0表示該元素處于正在掉落狀態(tài)。
(3)對剛剛掉落狀態(tài)標(biāo)志位a=1的元素進(jìn)行消除判定,即判斷該元素能否與周圍的元素產(chǎn)生消除動作:若能,則執(zhí)行消除動作,消除該元素所有屬性并釋放;若不能,則將該元素狀態(tài)位a置為0,狀態(tài)位b置為1表示該元素已經(jīng)處于完成掉落的狀態(tài)。
(4)直到所有元素的標(biāo)志位都是b=1,則退出該循環(huán)檢測過程。
步驟5:針對玩家一次操作的算法執(zhí)行結(jié)束。當(dāng)游戲再次接收到玩家操作動作時將繼續(xù)從步驟3開始執(zhí)行。