謝秋華
(三明學(xué)院信息工程學(xué)院,福建三明365004)
基于Cocos2d-x的游戲的幾個(gè)關(guān)鍵技術(shù)的實(shí)現(xiàn)
謝秋華
(三明學(xué)院信息工程學(xué)院,福建三明365004)
利用單例類的方法對數(shù)據(jù)進(jìn)行存取,改變了原來會(huì)出現(xiàn)臟數(shù)據(jù)的狀況,可以實(shí)現(xiàn)任何場景下讀寫的數(shù)據(jù)實(shí)時(shí)正確,用繼承引擎固有的類產(chǎn)生的新類創(chuàng)建動(dòng)作而后進(jìn)行碰撞檢測,改變了原來精靈不受控制的飛出界面的狀況,用這種方法可以解決很多難解的問題。同時(shí)給出了內(nèi)存優(yōu)化原則。
單例類;臟數(shù)據(jù);碰撞檢測;內(nèi)存優(yōu)化
Cocos2d-x是一個(gè)開源的簡單卻強(qiáng)大的二維游戲引擎。雖然它有強(qiáng)大的優(yōu)勢,也存在著不少的問題。比如存在臟數(shù)據(jù)的問題,存在有些圖片文件無法正確加載的問題,以及碰撞檢測的問題。這些問題會(huì)影響游戲的正確運(yùn)行和性能。
1.1本款游戲的設(shè)計(jì)思想
本款游戲?yàn)橐豢钚⌒陀螒颍瑢儆谔S類游戲,雖然簡單,卻基本涵蓋了用Cocos2d-x引擎開發(fā)游戲所需要用到的知識,包括:游戲基本元素的生成、動(dòng)作的實(shí)現(xiàn)、動(dòng)畫與場景特效的實(shí)現(xiàn)、音樂與音效的播放、用戶輸入的處理、產(chǎn)生粒子效果、碰撞檢測的實(shí)現(xiàn)以及實(shí)現(xiàn)數(shù)據(jù)的持久化[1]。本款游戲?qū)儆谛蓍e類游戲,工作勞累之余輕點(diǎn)屏幕玩此游戲,即可放松身心,愉悅心情。
1.2開發(fā)游戲時(shí)存在的問題
(1)在游戲主界面會(huì)實(shí)時(shí)計(jì)算游戲主角所得分?jǐn)?shù),游戲結(jié)束時(shí)進(jìn)入結(jié)束界面,結(jié)束界面會(huì)給出游戲主角所得分?jǐn)?shù)和歷史最高分等。若是用常用的小型游戲的數(shù)據(jù)庫所用的Userdefault,會(huì)導(dǎo)致顯示的數(shù)據(jù)不是當(dāng)前數(shù)據(jù),而是歷史數(shù)據(jù),即數(shù)據(jù)不正確。
(2)在使用圖片文件生成精靈的時(shí)候,有時(shí)會(huì)不成功,導(dǎo)致游戲無法正確運(yùn)行。
(3)本游戲是跳躍類游戲,碰撞檢測在所難免。
(4)若是在創(chuàng)建精靈的基礎(chǔ)上再使用jumpby等動(dòng)作并進(jìn)行碰撞檢測,會(huì)導(dǎo)致出現(xiàn)異常如:小動(dòng)物不受控制地飛出屏幕。
(5)內(nèi)存優(yōu)化問題是手游的關(guān)鍵問題。
2.1用單例類實(shí)現(xiàn)多線程安全模式的數(shù)據(jù)持久化
由于此游戲是一款小型游戲,用userdefault就可實(shí)現(xiàn)數(shù)據(jù)的持久化。但是若只是簡單地使用Userdefault進(jìn)行讀寫數(shù)據(jù),在運(yùn)行時(shí)會(huì)出現(xiàn)顯示的歷史最高分不是真正的歷史最高分,數(shù)據(jù)的實(shí)時(shí)性得不到體現(xiàn)。若是創(chuàng)建一個(gè)單例類來專門進(jìn)行數(shù)據(jù)的讀寫則可以解決這一問題。代碼如下:
以下為.h文件,創(chuàng)建一個(gè)單例類。
readandwrite();//禁止外部創(chuàng)建新的實(shí)例
~readandwrite();
bool init();//禁止外部創(chuàng)建新的實(shí)例
};
具體的代碼在以下的.cpp文件里,代碼如下:
如此一來,游戲中只有一個(gè)讀寫數(shù)據(jù)的實(shí)例,而且由于對獲取實(shí)例的方法進(jìn)行同步,可以實(shí)現(xiàn)多線程下的線程安全性。用以上代碼實(shí)現(xiàn)數(shù)據(jù)的持久化則可以實(shí)現(xiàn)讀寫的數(shù)據(jù)都是實(shí)時(shí)正確的[2]。
2.2不同文件形式采用不同的精靈創(chuàng)建方法
在使用圖片文件時(shí),要注意圖片文件的格式,針對圖片文件的格式進(jìn)行相應(yīng)的應(yīng)用。如果圖片文件的png文件對應(yīng)的plist文件的內(nèi)容類似如下所示:
則以精靈幀來創(chuàng)建精靈對象,代碼如下所示例:
auto fish=Sprite::createWithSpriteFrameName("Amphiprion_death_001.png");如果圖片文件的png文件對應(yīng)的plist文件的內(nèi)容類似如下所示:
則可以使用圖片文件中一塊矩形區(qū)域來創(chuàng)建精靈對象,代碼如下所示例:
auto netR=Sprite::create("GameScene/bullet10-hd.png",Rect::Rect(1,1,106,105));若是只有一張png圖片文件,沒有對應(yīng)的plist文件;或者是jpg文件,則以圖片文件來創(chuàng)建精靈對象,代碼如下所示例:
(對應(yīng)于png文件)
(對應(yīng)于jpg文件)
反之,可以用相應(yīng)的繪圖軟件按照所用代碼的形式繪制相應(yīng)圖片文件以及配套文件進(jìn)行精靈的創(chuàng)建。
2.3矩形碰撞檢測
碰撞檢測是游戲中的主要問題所在,在Cocos2d-x中,可以用矩形與矩形實(shí)現(xiàn)碰撞檢測、點(diǎn)與矩形實(shí)現(xiàn)碰撞檢測、矩形與圓實(shí)現(xiàn)碰撞檢測、圓與圓實(shí)現(xiàn)碰撞檢測,也可以用物理引擎實(shí)現(xiàn)碰撞檢測。本游戲中使用了矩形與矩形的碰撞檢測。以子彈和魚的碰撞檢測為例,下面給出主要實(shí)現(xiàn)代碼:
if(fish->getBoundingBox().intersectsRect(zidan->getBoundingBox())//碰撞檢測){
//碰撞處理
檢測到碰撞后,游戲主角分值根據(jù)所碰撞到的道具增加相應(yīng)分值,并且游戲主角高度根據(jù)碰撞到的道具相應(yīng)增加,而后在新的高度不停跳躍。點(diǎn)與矩形實(shí)現(xiàn)碰撞檢測的代碼稍微簡單示例如下:
矩形與圓實(shí)現(xiàn)碰撞檢測,圓與圓實(shí)現(xiàn)碰撞檢測,以及用物理引擎實(shí)現(xiàn)碰撞檢測的代碼都較為繁復(fù),這里不再贅述[3]。
2.4靈活使用動(dòng)作類繼承并加以擴(kuò)充解決碰撞時(shí)方向性問題
游戲主角在碰撞到道具后分?jǐn)?shù)會(huì)增值并且所在高度會(huì)增加。但是碰撞檢測只管是否接觸到而不管是如何接觸的,因此游戲主角向上跳躍時(shí)碰到道具碰撞檢測也會(huì)處理,這樣就會(huì)導(dǎo)致游戲主角不受控制地飛出屏幕。為了解決這一問題,定義了一個(gè)JumpBy的子類,并且在子類中增加了一個(gè)屬性direction,根據(jù)direction的值來判斷游戲主角是向上還是向下運(yùn)動(dòng),若是向下運(yùn)動(dòng),則進(jìn)行碰撞檢測并進(jìn)行相應(yīng)處理,這樣就避免了誤判并飛出屏幕。相應(yīng)代碼部分如下[4-5]:
2.5內(nèi)存優(yōu)化原則
(1)首先優(yōu)化紋理。影響紋理使用內(nèi)存的因素為:紋理的格式(壓縮和沒有壓縮)、色深和大小。可以使用pvr格式的紋理來減少內(nèi)存的使用。顏色豐富的紋理,會(huì)獲得更好的圖片質(zhì)量,但是會(huì)消耗更多的內(nèi)存??梢允褂蒙頡BGA4444來代替RBGA8888,這樣能節(jié)省一半的內(nèi)存。最好使用中等大小的紋理。
(2)其次,從音頻入手。影響音頻文件內(nèi)存使用的因素為:音頻文件的格式、比特率和采樣率。用mp3的音頻格式文件比較好,因?yàn)樗瑫r(shí)支持android和ios平臺,都被壓縮過并且能夠使用硬件加速。應(yīng)當(dāng)讓背景音樂文件大小低于800k。最簡單的辦法是減少背景音樂時(shí)間,用程序使之循環(huán)播放。音頻文件采樣率保持在96-128kbps,比特率在44kHz就可以了。
(3)最后,是字體和粒子的優(yōu)化。當(dāng)要顯示游戲分?jǐn)?shù)的時(shí)候用BMFont,選擇最少字符的圖片文件,如果只是想要顯示純數(shù)字,可以刪掉其他的字母。至于粒子,可以通過減少粒子的數(shù)目來減少內(nèi)存的使用。
在cocos2d-x框架下設(shè)計(jì)并開發(fā)了一款小型的休閑類游戲。對游戲的幾個(gè)關(guān)鍵技術(shù)提出解決辦法如單例類和繼承派生等。在沒有使用單例類來操作數(shù)據(jù)時(shí),數(shù)據(jù)不能跨場景使用,若跨場景使用則不正確,使用單例類后,游戲分?jǐn)?shù)等數(shù)據(jù)可以跨場景使用而不會(huì)出現(xiàn)臟數(shù)據(jù);使用引擎動(dòng)作并進(jìn)行碰撞檢測時(shí)精靈會(huì)不受控制地飛出屏幕,而使用引擎動(dòng)作的繼承和派生能避免精靈不受控制地飛出屏幕的缺陷。這里提出一種新的解決思路:用繼承引擎自帶的類而產(chǎn)生的子類來完成相應(yīng)的需要的游戲功能。這一思想非常有用,可以解決很多難解的問題。
[1]火烈鳥網(wǎng)絡(luò)科技.Cocos2d-x高級開發(fā)教程:制作自己的《捕魚達(dá)人》[M].北京:人民郵電出版社,2014:60-124,194-205.
[2]子龍山人.再談單例模式[EB/OL].(2014-07-03)[2015-03-12].http://cn.cocos2d-x.org/tutorial/show?id=1040.
[3]秦彩杰,胥楚貴.基于J2ME手機(jī)游戲中關(guān)鍵技術(shù)的設(shè)計(jì)與實(shí)現(xiàn)[J].三明學(xué)院學(xué)報(bào),2012,29(2):30-34.
[4]Cocos2d-x3.0過渡篇(二十二)各種遍歷與范圍for語句的使用[EB/OL].(2014-4-2)[2015-3-12].http://www.it165.net/pro/htm l/201404/11330.htm l.
[5]笨木頭.Cocos2d-x3.0游戲?qū)嵗秳e救我》第七篇—物理世界的碰撞檢測[EB/OL].(2014-5-2)[2015-3-12].http://www.benmutou.com/archives/920.
(責(zé)任編輯:朱聯(lián)九)
Realization of Key Technology in Game Based on Cocos2d-x
XIE Qiu-hua
(Institute of Mathematics and Information Engineering,Sanming University,Sanming 365004,China)
It can realize tomake the data read and write correctly at real-time by using singleton class to access the data and change the original situation that can appear dirty data.It creates an action and then carry on collision detection by using a class that inherits the engine and changes the situation that the sprite flies freely outof interface.It can also solvemany difficultproblems.At the same time,the principle ofmemory optim ization is given out.
singleton class;dirty data;collision detection;memory optim ization
TP311.52
A
1673-4343(2015)06-0026-06
10.14098/j.cn35-1288/z.2015.06.006
2015-03-17
福建省教育通科技項(xiàng)目(JA13295);三明市科技項(xiàng)目(2013-5-2)
謝秋華,女,福建三明人,講師。主要研究方向:數(shù)據(jù)挖掘。