版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
目錄175481緒論 134171.1開發(fā)背景
172231.2發(fā)展趨勢
213391.3研究意義
2217641.4國內(nèi)外現(xiàn)狀 387382相關(guān)知識簡介 4119182.1游戲引擎簡介 4292872.2Cocos2d-x開源游戲引擎簡介 5241162.3Shader簡介 6237282.4GLSL簡介 691532.5JNI簡介 7118912.6Android簽名簡介 7144252.7其他游戲制作輔助軟件工具介紹 8326752.7.1TexturePacker(圖片打包軟件) 846102.7.2TiledMap(地圖編輯工具軟件) 973302.7.3BMFont(位圖字體制作軟件) 1021072.7.4ParticleDesigner(粒子系統(tǒng)可視化編輯軟件) 11289133總體設(shè)計 1326863.1游戲總體概述 13543.2游戲運行流程 13244843.3游戲特色玩法概述 15103773.4游戲操作設(shè)計 15239313.5游戲關(guān)卡設(shè)計 15513.6游戲模塊設(shè)計 16169184詳細設(shè)計 17292394.1游戲運行流程 17257634.2游戲模塊 1862454.2.1游戲場景 18250214.2.2主角 1817364.2.3荷葉 21183354.2.4地圖 2470764.3公共管理控制模塊 29104034.4高級模塊部分 29164944.4.1Shader簡單應(yīng)用 30283924.4.2廣告SDK接入 32110955系統(tǒng)測試 39251235.1游戲場景測試 39282625.2游戲邏輯測試 3963625.3游戲音效測試 40184875.4游戲數(shù)據(jù)測試 4063045.5游戲性能測試 4130315.6游戲廣告測試 41176756結(jié)論 4324662致謝 4431607參考文獻 45西南石油大學(xué)本科畢業(yè)設(shè)計(論文)基于cocos-2dx開源游戲引擎的游戲開發(fā)與設(shè)計PAGEPAGE44PAGEPAGE43緒論當今時代手機、iPad等移動設(shè)備如雨后春筍一般迅速崛起,硬件的性能更是呈現(xiàn)幾何倍數(shù)增長,越來越多的老百姓用上了智能手機,iPad也進入了千家萬戶。隨著手機、iPad等移動設(shè)備的普及,隨著移動互聯(lián)網(wǎng)的性能發(fā)展的越來越快速,手機游戲漸漸發(fā)達了起來,手機游戲開始逐步霸占游戲市場。人們的時間大多都花費在手機上,因為生活的節(jié)奏不斷的加快,人們的有太多時間是瑣碎的,比如公交車上,火車上,地鐵上等等,這些瑣碎的時間都將消耗在手機、iPad上,這一現(xiàn)象更是讓手游這個行業(yè)崛起的更加迅速和穩(wěn)定,也將是一個未來的趨勢。隨著智能手機的橫空出世,手游產(chǎn)業(yè)也從當年的微不足道發(fā)展成如今的空前壯大,回顧手游的發(fā)展歷程,它把機遇拋向無數(shù)的創(chuàng)業(yè)者,一批又批優(yōu)秀的手游開發(fā)運營商在這個市場中開始凸現(xiàn)出來。如今,現(xiàn)代人日常生活已經(jīng)離不開智能手機了,而手游也逐漸成為現(xiàn)代人日常生活和娛樂的一部分。手游最大的發(fā)展機遇在于用戶的數(shù)量,所有使用智能手機的用戶都是手游產(chǎn)品的目標,而且這一目標在未來只會越來越多,因此手游的市場在不斷的壯大,然而具體到某一款手游產(chǎn)品上,情況就大有不相同了。但是對于廣闊的手游市場來說,機會隨時隨地都在產(chǎn)生,這種不確定性的發(fā)展和爆發(fā)性,讓所有的手游開發(fā)商都感到興奮不已。開發(fā)背景
手游是指在手機、iPad等各類手持設(shè)備上運行的游戲類應(yīng)用程序,其運行需要一定的硬件環(huán)境和相關(guān)的系統(tǒng)基礎(chǔ)。從2005年開始,圖形化手機游戲開始出現(xiàn),種類和數(shù)量在不斷激增。2005年6月,盛大和英特爾宣布攜手共同開發(fā)國內(nèi)手游市場,手游行業(yè)陣營和規(guī)模開始空前壯大,繼盛大、北京掌訊、美通之后,網(wǎng)易、空中甚至騰訊等也紛紛加入其中。手游正處于起步發(fā)展時期,在接下來的兩三年中,手機游戲必將進入快速發(fā)展時期。
然而隨著產(chǎn)業(yè)的不斷發(fā)展,不斷有新的手游公司成立,2015年的手游市場也不能盲目樂觀,手機游戲市場開始飽和,機遇與挑戰(zhàn)并存。開發(fā)一款手游對于我來說是一個提升,對手游的理解,對手游的開發(fā)和上線的過程進行嘗試,積累重要的經(jīng)驗和應(yīng)對各種艱難的挑戰(zhàn)的資本,為以后進入這個行業(yè)打下堅實的基礎(chǔ)。發(fā)展趨勢
近年來,隨著智能機的普及以及3G、4G的新型高速網(wǎng)絡(luò)的出現(xiàn),為手機網(wǎng)游的興起打下了堅實的基礎(chǔ),現(xiàn)在手機網(wǎng)游玩家已經(jīng)不計其數(shù)。2014年,國內(nèi)移動互聯(lián)網(wǎng)競爭格局未定,運營商為了快速吞噬這塊蛋糕,占有更多的自主權(quán),轉(zhuǎn)型力度、資源投入日趨加大。在部分細化領(lǐng)域,圍繞運營商轉(zhuǎn)型的業(yè)務(wù)和渠道價值驟然放大,引發(fā)產(chǎn)業(yè)整合日趨頻繁。在此背景下,國內(nèi)移動互聯(lián)龍頭拓維信息通過多年技術(shù)積累及運營商渠道優(yōu)勢,確定以手機動漫與游戲業(yè)務(wù)為兩大核心發(fā)展方向之一。手游最大的發(fā)展機遇在于用戶的數(shù)量,所有使用智能手機的用戶都是手游產(chǎn)品的目標,而且這一目標在未來只會越來越多,因此手游的市場在不斷的壯大,當然具體到某一款手游產(chǎn)品上,情況可能就大不相同了。但是對于廣闊的手游市場來說,機會隨時隨地都在產(chǎn)生。研究意義
全球在使用的智能手機和移動設(shè)備已經(jīng)超過20億部,而且這個數(shù)字時時刻刻都在不斷增加,并且現(xiàn)在,手機用戶遠遠超過了計算機用戶。手機游戲潛在的市場比其他任何平臺都廣,雖然和游戲控制臺或者PC相比,手機可能并不是一個非常理想的游戲設(shè)備,但畢竟人們總是隨時隨地攜帶,隨時隨地都可以打開手機玩游戲,這樣手機游戲必然成為人們消遣時間的首選。手機的便攜性、移動性滿足了用戶隨時隨地玩游戲的需求,用戶可以在任何無聊的時間進行游戲,比如排隊、等車、坐車等等。據(jù)調(diào)查顯示,30%的用戶在玩手機玩游戲以后PC端玩游戲的時間減少,手機游戲的時間開始搶奪電腦游戲的時間,20%的用戶玩手機游戲的時間不斷加長,手機游戲已然成為人們最為普遍的娛樂方式。隨著移動網(wǎng)絡(luò)的發(fā)展,移動游戲越來越被大家所青睞。據(jù)研究表明,手機游戲業(yè)務(wù)營收是掌機的3倍。手機游戲的市場潛力巨大,而投入資金少,吸引了很多其他的市場投入,但中小型開發(fā)團隊在激烈的競爭中的生存問題仍然非常嚴峻。手機游戲開發(fā)商和服務(wù)提供商不重視市場宣傳和推廣工作,忽略了用戶對于游戲產(chǎn)品的體驗和習(xí)慣培養(yǎng)的重要性。手機游戲市場競爭愈演愈烈,該競爭涉及到全球所有的手機游戲開發(fā)商。手機游戲開發(fā)商追求低成本和短期利益,游戲產(chǎn)品的質(zhì)量粗糙,以及手機游戲的抄襲也越來越嚴重,創(chuàng)新力嚴重不足。國內(nèi)外現(xiàn)狀國內(nèi)手游的質(zhì)量低下,創(chuàng)新力度嚴重不足,抄襲非常嚴重。而國外的游戲?qū)映霾桓F,無論是在質(zhì)量還是創(chuàng)新力度都遠遠高于國內(nèi)的市場。AppStore中的游戲和國內(nèi)的各大Android市場的游戲比較,將會發(fā)現(xiàn),AppStore中大多數(shù)游戲都在國內(nèi)的Android市場中有他的影子,但是質(zhì)量遠遠不足,都是抄襲而來。而且國外的手游在AppStore中收費比較規(guī)范,而國內(nèi)的手游扣費很不規(guī)范,各種暗扣導(dǎo)致用戶一不留神就被收取了費用,這也是國內(nèi)游戲的質(zhì)量低下而數(shù)量多的原因。追求數(shù)量多,而質(zhì)量粗糙,在乎當前眼前的利益而忽視了長久的效益。國內(nèi)的游戲的數(shù)量增長速率非常的恐怖,由于手游的開發(fā)非常廉價快速和容易,導(dǎo)致國內(nèi)的手游企業(yè)迅速崛起,認為只要做出游戲就能掙錢,這也是一個非常重要的原因。由此可見,國內(nèi)的手游的問題最為嚴重,需要各大企業(yè)重新思考,如何在市場上占有一席之地。提高游戲的質(zhì)量,強調(diào)創(chuàng)新的重要性,這將是國內(nèi)手游的發(fā)展的核心關(guān)鍵性問題。因此國內(nèi)很多小企業(yè)、小團隊如果繼續(xù)原來的運作模式不依靠大公司的平臺和力量,將會被淘汰,將會被那些追隨市場趨勢的大公司所代替。相關(guān)知識簡介游戲引擎簡介游戲引擎是指一些已經(jīng)花費了很多精力編寫好的可編輯游戲的系統(tǒng)或者一些交互式實時圖像應(yīng)用程序的具有針對性的核心組件。這些系統(tǒng)為游戲開發(fā)者提供了各種編寫游戲所需要的各種工具組件,以便游戲開發(fā)者能容易和快速地做出游戲程序,而不用做很多重復(fù)性的工作。游戲引擎通常包含以下系統(tǒng):渲染引擎、物理引擎、碰撞檢測系統(tǒng)、音效、腳本引擎、網(wǎng)絡(luò)引擎以及場景管理等。游戲引擎提供一系列可視化的開發(fā)工具、可重用組件以及一些預(yù)制件。這些工具通過與開發(fā)環(huán)境進行集成,方便開發(fā)者簡單、快速進行以游戲邏輯為核心的游戲開發(fā)。為了提高游戲開發(fā)人員的開發(fā)效率,引擎還集成了聲音、操控和網(wǎng)絡(luò)等其他功能部件。游戲引擎可以提供靈活和重用平臺,向游戲開發(fā)者提供所需要的全部核心功能,從而節(jié)省大量的游戲開發(fā)費用和開發(fā)時間,降低了開發(fā)的復(fù)雜性,縮短游戲的上市時間,并且這些要素正是所有這些對于高競爭性的游戲產(chǎn)業(yè)非常關(guān)鍵的因素。游戲引擎通常也會被要去具有跨平臺的能力,游戲引擎通常會提供平臺抽象層,實現(xiàn)同一款游戲可以在各種不同的平臺上運行,平臺包括游戲機、個人電腦和手機,而只需要改動少量的源代碼。一般來說,游戲引擎均設(shè)計成基于組件的架構(gòu),方便進行特定子系統(tǒng)的替換或者添加新的引擎中間件,從而實現(xiàn)功能的擴展。通過組件技術(shù),游戲引擎具有了擴展性,而擴展性無疑是游戲引擎最為重要的特性。游戲引擎有時也會應(yīng)用于實時圖像交互的應(yīng)用,比如場景演示,建筑建造模擬,模擬訓(xùn)練,環(huán)境建模等等。3D引擎的渲染系統(tǒng)往往建立在一套高級的圖像API之上,這些API通??梢圆僮饔布?,諸如Direct3D或OpenGL,這些API封裝了GPU和顯卡的部分核心功能。引擎中還包含了很多其他的重要的功能模塊,他們提供對其他硬件設(shè)備的獨立支持,諸如輸入設(shè)備(鼠標、鍵盤、控制桿)、網(wǎng)卡、聲卡。在具有硬件加速能力的圖形卡出現(xiàn)以前,開發(fā)者使用軟件渲染,這種渲染效率稍微低下一點?,F(xiàn)在軟件渲染通常被用于非實時圖像的渲染。一些開源游戲引擎會提供完整的源代碼,其他的只提供一個經(jīng)過封裝的API接口,使用者用過調(diào)用DLL文件中的函數(shù)和方法來使用這個引擎。Cocos2d-x開源游戲引擎簡介Cocos2d-x是一個開源的2D游戲開發(fā)框架,MIT許可證下發(fā)布的。這是一個C++Cocos2d-iPhone項目的版本。Cocos2d-X發(fā)展的重點是圍繞Cocos2d跨平臺,Cocos2d-x提供的框架。代碼可以用C++或者Lua編寫,使用API都是Cocos2d-x提供的。Cocos2d-x項目可以很輕松地建立和運行在iOS,Android,WindowsPhone等移動操作系統(tǒng)中。Cocos2d-x還支持Windows、Mac和Linux等PC桌面操作系統(tǒng),因此,開發(fā)者可以很容易在桌面操作系統(tǒng)中編碼和調(diào)試。Cocos2d-x是一個跨平臺的2D游戲引擎,使用C++開發(fā),基于OpenGLES,源于Cocos2d-iphone,目前支持iOS4.1,Android2.1及更高版本,WindowsXP&Windows7,WindowsPhone8.什么是“x”?C++文件命名方式:有時候,用戶寫的cpp文件擴展CXX.“x”,標志著該項目是由C++開發(fā),并提供C++的API編寫的?!皒”,也意味著交叉。這個開源項目的目標是讓用戶所編寫的代碼具有跨平臺的能力。支持的平臺是在iOS,Android的,WinPhone,Win32平臺上,并且平臺的種類正在不斷的擴大。主要功能:1.流程控制:輕松簡單地管理不同場景之間的流程控制。2.精靈:快速而方便的精靈對象。3.動作:讓精靈們做出不同的行為??山M合的動作如移動、旋轉(zhuǎn)、縮放、消失和變色等更多。4.特效:特效包括波浪、旋轉(zhuǎn)和透鏡等更多。5.平面地圖:支持包括矩形和六邊形平面地圖。6.轉(zhuǎn)換:場景之間的切換。7.菜單:創(chuàng)建內(nèi)部菜單。8.文本渲染:支持標簽和HTML標簽動作。9.文檔:編程指南、API文檔、自帶的很多測試程序樣例。10.MIT許可:盡管用就是了。11.基于OpenGL:支持底層硬件加速。12.3D對象:MD2模型支持。13.腳本語言:支持Lua,JavaScript語言。引擎應(yīng)用:Cocos2d-x引擎在國內(nèi)手機游戲中占有的市場份額超過60%,而國外使用份額則是不到30%,在AppStore排行榜的top10里面,有6個都是用使用Cocos2d-x引擎開發(fā)的。由此可見Cocos2d-x的使用率還是相當高的。Shader簡介Shader:著色器。是一段能夠針對3D對象進行操作、并被GPU所執(zhí)行的程序。通過這些程序,程序員就能夠自如的設(shè)計絕大部分想要的圖形效果。在一個3D場景中,可能包含許多Shader。這些Shader中有的負責(zé)對3D對象表面進行計算處理,有的負責(zé)對3D對象的紋理進行處理,有的負責(zé)對3D對象的光照進行處理。一般根據(jù)操作對象的不同,程序被分為對頂點進行各種操作的VertexShader(頂點渲染引擎)和對像素進行各種操作的PixelShader(像素渲染引擎)。GLSL簡介GLSL:OpenGL著色語言(OpenGLShadingLanguage)是用來在OpenGL中進行著色編程的語言,是開發(fā)人員寫的短小的高效的自定義程序,他們將在圖形卡的GPU(GraphicProcessorUnit圖形處理單元)上并行執(zhí)行的,代替了固定的渲染管線的一部分,使渲染管線中不同層次具有可編程型。比如:投影變換、視圖轉(zhuǎn)換等。GLSL的著色器代碼分成2個部分:VertexShader(頂點著色器)和FragmentShader(片元著色器),有時還會有GeometryShader(幾何著色器)。頂點著色器負責(zé)運行頂點著色,和坐標變換。它可以得到當前OpenGL中的狀態(tài),通過易變變量和GLSL的片元著色器進行交換,通過一致變量可以使外部程序和著色器的進行數(shù)據(jù)交互。GLSL其使用C語言作為基礎(chǔ)高階著色語言,避免了使用匯編語言或者硬件規(guī)格語言的復(fù)雜性。JNI簡介JNI。從Java1.1開始,JavaNativeInterface(JNI)標準成為java平臺的一部分,它允許Java代碼和其他語言寫的代碼進行底層交互。JNI一開始是為了本地編程語言,特別是C和C++,但是它也可允許你使用其他語言,只要符合調(diào)用約定支持就可以。使用java與本地已編譯的代碼進行交互,通常會喪失平臺的可移植性。但是,有些情況下這樣做是可以接受的,甚至是必須的。例如,使用一些舊的庫,與硬件、操作系統(tǒng)進行交互,或者為了提高程序的性能。JNI標準至少保證本地代碼能工作在任何Java虛擬機環(huán)境下。運行如圖5.1JNI結(jié)構(gòu)關(guān)系圖。圖2.1JNI結(jié)構(gòu)關(guān)系圖Android簽名簡介在Android系統(tǒng)中,所有被安裝到系統(tǒng)的應(yīng)用程序都必有一個數(shù)字證書,此數(shù)字證書用于標識應(yīng)用程序的作者和在應(yīng)用程序之間建立信任關(guān)系,如果一個permission的protectionLevel為signature,那么就只有那些跟該permission所在的程序擁有同一個數(shù)字證書的應(yīng)用程序才能取得該權(quán)限。Android使用Java的數(shù)字證書相關(guān)的機制來給應(yīng)用程序進行簽名。Android系統(tǒng)要求系統(tǒng)中的任何一個應(yīng)用程序都必須經(jīng)過數(shù)字證書簽名,數(shù)字證書的私鑰則保存在應(yīng)用開發(fā)者的手中。Android將數(shù)字證書用來標識應(yīng)用程序的作者和在應(yīng)用程序之間建立信任關(guān)系,不是用來決定最終用戶可以安裝哪些應(yīng)用程序。這個數(shù)字證書并不需要權(quán)威的數(shù)字證書簽名機構(gòu)認證,它只是用來讓應(yīng)用程序包進行自我認證的。Android數(shù)字證書內(nèi)容包含以下幾個要點:1.任何一個應(yīng)用程序都必須有數(shù)字證書,Android系統(tǒng)拒絕安裝任何沒有數(shù)字簽名的應(yīng)用程序。2.Android程序包使用的數(shù)字證書可以是自簽名的,并不需要是一個權(quán)威的數(shù)字證書機構(gòu)簽名認證。3.如果要正式發(fā)布一個Android應(yīng)用程序,必須使用一個合適的私鑰生成的數(shù)字證書來給程序簽名,即必須使用Android的開發(fā)工具(ADT插件和Ant)生成的發(fā)布模式的證書來簽名。4.數(shù)字證書都是有有效期的,Android只是在應(yīng)用程序安裝的時候會檢查證書的有效期。如果程序已經(jīng)安裝到系統(tǒng)當中,證書過期不會影響程序的正常功能。5.Android使用標準的java工具KeytoolandJarsigner來生成數(shù)字證書,并通過Android的開發(fā)工具(ADT插件和Ant)給應(yīng)用程序包簽名。6.使用zipalign優(yōu)化程序。Android系統(tǒng)絕對不會安裝運行任何一款沒有數(shù)字簽名的應(yīng)用程序,無論是在Android模擬器上還是在真實的物理設(shè)備上。Android的開發(fā)工具(ADT插件和Ant)都可以協(xié)助開發(fā)者給應(yīng)用程序進行簽名,它們都有兩種模式:調(diào)試模式(debugmode)和發(fā)布模式(releasemode)。其他游戲制作輔助軟件工具介紹TexturePacker(圖片打包軟件)TexturePacker這個詞從字面來說就是Texture(紋理)+Packer(打包)。它是一款把許多細碎的圖片紋理拼接為一張大圖的工具。運行截圖如圖2.2TexturePacker運行截圖。功能:在OpenGL載入圖片紋理的時候,為了繪制效率會將的圖片紋理的內(nèi)存自動對其或者擴張到2的n次方。例如,如果你的資源素材是9×17px,那么將會按16×32規(guī)格載入紋理圖片。如果圖片紋理是129×64,那么就會按照256×64載入了。因此這些情況將會浪費極大的內(nèi)存空間,然而移動設(shè)備上的游戲,內(nèi)存是非常珍貴的。理論上,如果每一張紋理圖片的長寬都恰好是2的n次方,那就非常完美了,就沒有任何浪費了。但是,在開發(fā)過程中這幾乎是不可能的。因此我們需要把很多小圖拼接到一張大圖里,比如(4096×4096)然后到代碼中去取需要的紋理就可以了。這樣,就可以減少內(nèi)存浪費。TexturePacker的優(yōu)點:1.TexturePacker有windows版。2.TexturePacker有免費版。(TexturePacker對于普通開發(fā)足夠用了)。3.TexturePacker支持pvr格式。4.TexturePacker支持命令行集成。圖2.2TexturePacker運行截圖TiledMap(地圖編輯工具軟件)從字面上看就是瓦塊地圖,他是一款將地圖像瓦塊一塊一塊填充編輯然后供游戲使用的工具。功能:大家都知道游戲的地圖一般都是很大很復(fù)雜的,為了簡化游戲的開發(fā),將地圖的編輯分離出來這就是TiledMap的功能,他可以將美術(shù)畫的一些基本物件原件的圖片像瓦塊一樣的拼起來,組成一個地圖,供游戲里面直接使用,非常方便靈活。運行截圖如圖2.3TiledMap運行截圖。優(yōu)點:1.和Cocos2d-x引擎兼容性非常好。2.支持對象屬性。3.操作非常方便,支持多選,克隆等操作。圖2.3TiledMap運行截圖BMFont(位圖字體制作軟件)從字面上看,BM代表位圖,F(xiàn)ont代表字體,就是制作位圖字體的軟件工具,可以將字體圖片和對應(yīng)的字符映射起來。運行截圖如圖2.4BMFont運行截圖。功能:游戲中的字體都是非常有個性的,并不像系統(tǒng)字體那么常見和通用,所以制作一款符合游戲風(fēng)格的字體的制作就先的很重要了,BMFont可以將一組尺寸一樣的圖片和對應(yīng)的字符集映射,從而產(chǎn)生一個字體,供游戲中使用。優(yōu)點:1.BMFont非常小,功能卻很全面。2.BMFont和Cocos2d-x游戲引擎兼容非常好。圖2.4BMFont運行截圖ParticleDesigner(粒子系統(tǒng)可視化編輯軟件)從字面上看,是粒子設(shè)計者,他是專門用來可視化編輯粒子系統(tǒng)的軟件,可以直觀的看到參數(shù)對應(yīng)的具體效果。運行截圖如圖2.5ParticleDesigner運行截圖。功能:游戲中的有粒子系統(tǒng)功能模塊,但是粒子系統(tǒng)的參數(shù)十分復(fù)雜,并且都是數(shù)字,無法直觀的看到粒子系統(tǒng)的效果。因此粒子系統(tǒng)可視化編輯軟件便應(yīng)運而生了,ParticleDesigner正是專門用來將這些數(shù)字對應(yīng)的效果顯示出來,并且可以動態(tài)的調(diào)試效果,而且可以導(dǎo)出cocos2d-x使用的plist格式的配置文件,供程序中直接使用。優(yōu)點:1.ParticleDesigner非常小,功能也算齊全。2.ParticleDesigner本身也是使用cocos2d-x開發(fā)的一款開源軟件,并且在github上有開源項目,可以下載下來直接使用,甚至還可以自己修改代碼,生成各種平臺的可執(zhí)行程序。圖2.5ParticleDesigner運行截圖總體設(shè)計游戲總體概述本游戲為迷宮益智型小游戲。在一幅鋪滿荷葉的池塘中,每個荷葉都是墊腳石,主角必須踩在荷葉上朝著終點行走。主角只能站立在一片荷葉上,并且向其他荷葉進行移動,荷葉有五種不同的形狀和兩種顏色,每種形狀有不同的方向指向,只有兩片荷葉的指向相通時才可以向該荷葉進行移動,否則不可移動,并且每移動到一片荷葉上,這片荷葉將會發(fā)生旋轉(zhuǎn),改變他的指向。顏色不同的兩種荷葉的旋轉(zhuǎn)方向是相反的,這樣使得更具有挑戰(zhàn)性。如果主角進入的那片荷葉沒有相通的荷葉,那么游戲以失敗結(jié)束。如果主角到達目標終點,那么游戲以勝利結(jié)束,并且會記錄行走的步驟,供再現(xiàn)模式展示使用。參見圖3.1游戲場運行流程圖和圖3.2游戲場景示意圖。游戲運行流程游戲的運行流程,如圖3.1游戲運行流程圖。游戲開始進入選關(guān)場景,可以選擇游戲模式和再現(xiàn)模式,然后選擇關(guān)卡后,進入游戲場景進行游戲或者重現(xiàn)游戲,游戲過程中可以重新開始本關(guān)卡或者返回選關(guān)場景。在游戲進行中,游戲成功或者失敗都將返回選關(guān)場景進行重新選擇關(guān)卡進行游戲,在選關(guān)場景可以還選擇退出游戲。重現(xiàn)游戲重現(xiàn)游戲重新開始游戲勝利、失敗、返回進行游戲游戲開始選關(guān)場景游戲場景游戲結(jié)束圖3.SEQ圖\*ARABIC\s11游戲運行流程圖圖3.2游戲場景示意圖游戲特色玩法概述1.游戲中的荷葉分為兩種,綠色和紫色,綠色的荷葉旋轉(zhuǎn)方向為逆時針方向,而紫色為順時針方向,因此在要進行移動的時候需要考慮他的轉(zhuǎn)向,而判斷是否對游戲的順利進行有利,更具有挑戰(zhàn)性。2.開始部分的關(guān)卡的荷葉總體數(shù)量較少,并且荷葉顏色基本為綠色,越往后面紫色越多,并且荷葉總量也越多,距離終點的路程也越長,最后兩種顏色的荷葉數(shù)量相持平,使得游戲的難度逐步加大,玩法過程更加有趣。3.游戲會記錄成功走法的步驟,如果下次以更少的步驟通關(guān),將會用新的步驟數(shù)據(jù)覆蓋原來的步驟數(shù)據(jù),通關(guān)的關(guān)卡下方將會顯示最佳記錄步數(shù),并且可以重現(xiàn)該記錄給玩家觀看。4.提示小貼士,在每次進入游戲場景的時候顯示游戲幫助提示標簽,游戲幫助標簽的內(nèi)容在幫助文本數(shù)據(jù)中進行隨機選擇。5.數(shù)據(jù)異常處理,關(guān)卡通關(guān)記錄的數(shù)據(jù)如果被惡意篡改也不會導(dǎo)致游戲崩潰,他會將正確的數(shù)據(jù)進行再現(xiàn),直到主角走到數(shù)據(jù)錯誤的位置時候才會提示錯誤并且返回選關(guān)場景。這樣就不會讓有用的數(shù)據(jù)因為一點點的其他錯誤而無法展示了。6.游戲可以放大場景,隨意拖動場景,即使是在再現(xiàn)模式也可以放大場景以及隨意拖動場景,以便玩家直接計算將來要走的所有步驟。7.每次進入游戲場景播放的音樂都是從音樂庫中隨機選取,將會使得游戲更加有趣。游戲操作設(shè)計1.玩家通過點擊屏幕上主角的周圍可通過的荷葉進行移動,如果點擊其他地方,將會有錯誤提示信息。2.一根手指在屏幕滑動的時候可以拖動場景,查看整個場景的布局,直到將場景脫出可視區(qū)域。3.兩根手指同時滑動可以放大和縮小游戲場景,縮放到最小的時候幾乎可以看見整個地圖的全貌,縮放到最大的比例為2.5倍。游戲關(guān)卡設(shè)計1.第一關(guān)設(shè)計為教學(xué)關(guān)卡,布局非常簡單,讓玩家可以非常容易輕松的過關(guān)并且了解玩法和操作的要領(lǐng),從第二關(guān)開始為正常的關(guān)卡。2.保證每個關(guān)卡必須有解,使用TiledMap手動拖放荷葉對象,并且進行嚴格測試,在保證有解的情況下仍然更加有趣。3.難度設(shè)計,關(guān)卡越往后越難,難度由荷葉的數(shù)量,和顏色的比例,以及距離終點的距離,以及具有欺騙性的布局的數(shù)量進行調(diào)整。游戲模塊設(shè)計1.主角模塊:玩家主要操作的對象,也是游戲最重要的表現(xiàn)形式之一,也是玩家最為頻繁接觸的對象。主角要對玩家的操作進行反應(yīng)和反饋,當玩家點擊可以走向的荷葉時,主角需要向那個荷葉進行行走,如果主角正在行走過程中,那么將不能對主角進行移動操作,如果要行走的目標方向不合法,要彈出錯誤提示。2.荷葉模塊:荷葉對象是游戲場景中占得面積最大的一塊,所以也是游戲的主要表現(xiàn)形式。荷葉將對主角的行為作出反應(yīng),當主角走入荷葉時,荷葉進行相應(yīng)的旋轉(zhuǎn),綠色逆時針旋轉(zhuǎn),紫色順時針旋轉(zhuǎn),當主角走入終點荷葉時游戲勝利。3.地圖模塊:所有的荷葉以及主角都在地圖上,地圖保存著荷葉的所有荷葉的數(shù)據(jù),包括荷葉的種類,轉(zhuǎn)向,等等,并且包含了主角的起始位置,目標終點位置。4.公共管理控制模塊:主要是一些常用的方法和管理器,管理器包括動畫管理器,音效管理器,以及數(shù)據(jù)管理。本模塊在游戲中占有非常重要的地位,其他所有模塊都有可能會用到這個模塊的內(nèi)容。詳細設(shè)計游戲運行流程游戲場景的運行流程圖,游戲開始時玩家點擊屏幕進行操作主角,如果點擊的是非荷葉的部分,那么提示無效,如果點擊的是荷葉,則判斷是否可以到達此荷葉,如果不可以到達那么彈出錯誤提示,如果點擊的荷葉可以到達,那么主角移動到此荷葉,并且此荷葉進行相應(yīng)的旋轉(zhuǎn),并且判斷這個荷葉是否是終點,如果是終點則游戲勝利,否則判斷是否有可以去的荷葉,如果有則不進行任何操作等待玩家的下一次點擊操作,如果沒有則游戲失敗。如圖4.1游戲場景運行流程圖。開始開始玩家點擊玩家點擊點擊可到達荷葉?否提示無效點擊可到達荷葉?否提示無效是是主角移動到該荷葉,旋轉(zhuǎn)荷葉主角移動到該荷葉,旋轉(zhuǎn)荷葉是游戲勝利荷葉為終點?是游戲勝利荷葉為終點?否否否是否是游戲失敗可以到達其他荷葉?游戲失敗可以到達其他荷葉?結(jié)束結(jié)束圖4.SEQ圖\*ARABIC\s11游戲場景運行流程圖游戲模塊游戲場景1.游戲開始場景:游戲開始場景最為簡單,只是展示游戲的標題名稱,和游戲的風(fēng)格,并給出開始游戲按鈕。2.游戲選關(guān)場景:本場景列出所有的關(guān)卡,供玩家選擇進行游戲的模式和關(guān)卡,點擊關(guān)卡按鈕便可進行游戲,本場景有退出游戲按鈕,只有這里可以進行退出游戲操作。3.游戲場景:核心場景,玩家進行游戲的場景,操作主角進行移動向終點行走。主角主角類的設(shè)計,是游戲的核心模塊之一,由玩家操作他,讓他按照玩家的操作做出不同的反應(yīng),是游戲的主要表現(xiàn)的對象。主角使用序列幀動畫,所用的圖片紋理如圖4.2主角序列幀動畫紋理圖集。圖4.2主角序列幀動畫紋理圖集主角繼承自cocos2d-x的Node類,并且添加很多額外的屬性:移動動作是否完成,當前所在荷葉,可以去的荷葉等等。主要代碼如下:classHero:publiccocos2d::Node{private: boolmovActionIsDone;//移動動作是否完成 Lotus*currentLotus;//當前所在荷葉 Lotus*canToLotus[4];//可以去的荷葉 unsignedcurrentStep;//當前步數(shù) cocos2d::Sprite*errorlabel;//錯誤標簽public: LevelDatalevelData;//步驟數(shù)據(jù) TiledMap*map;//地圖 floatstepSize;//步距 cocos2d::Sprite*hero;//主角精靈……主角的核心方法如下:1.初始化方法(init):在某個關(guān)卡的地圖上初始化主角,包括初始化主角的位置,主角的所有屬性,以及最重要的步驟數(shù)據(jù)。核心代碼如下:boolHero::init(TiledMap*&m,unsignedintlevel){//初始化屬性數(shù)據(jù) this->addChild(hero); map=m; map->tiledMap->addChild(this,5); stepSize=map->tiledMap->getTileSize().width; hero->setAnchorPoint(map->getHeroAnchorPos()); hero->setPosition(map->getHeroPos()); currentLotus=map->getLotus(hero->getPosition()); findCantoLotus();//查找所有可以去的荷葉…… if(PLAY_STATUS==Breakthrough) {//初始化步驟數(shù)據(jù) levelData.step4s=(StepDir*)::operator new(sizeof(StepDir)*MAX_STEP_SIZE_4); }……2.移動方法(move):使主角在荷葉間移動包括4個方向上下左右,并且在移動之前需要判斷這次的移動是否合法,如果已經(jīng)在移動的狀態(tài)下是不可以進行移動的。核心代碼如下:voidHero::move(AnimationKeydir){ if(!movActionIsDone)return; CCPointmoveByPosition; switch(dir) { caseaDown: moveByPosition=ccp(0.0f,-stepSize);break; caseaLeft: moveByPosition=ccp(-stepSize,0.0f);break;…… } CCAnimate*animate=CCAnimate::create(AnimationManager::getAnimation(dir));…… hero->runAction(movAction);}3.自動移動方法(autoMove):實現(xiàn)關(guān)卡再現(xiàn)的功能,讓主角按照關(guān)卡數(shù)據(jù)自動移動。每次行走讀取一次步驟數(shù)據(jù),然后行走,并且在行走完成后添加回調(diào),回調(diào)函數(shù)為本函數(shù)進行迭代,每一次行走都會檢查是否正確,如果不正確那么意味著步驟數(shù)據(jù)異常,彈出錯誤提示,刪除本關(guān)錯誤的步驟數(shù)據(jù),并且返回選關(guān)關(guān)卡。核心代碼如下:voidHero::autoMove(){ if(!movActionIsDone)return; currentStep++; AnimationKeydir=getlevelDataDir(currentStep,levelData);//獲取步驟數(shù)據(jù) CCPointmoveByPosition; switch(dir) { caseaDown: moveByPosition=ccp(0.0f,-stepSize); break; ……} CCAnimate*animate= CCAnimate::create(AnimationManager::getAnimation(dir));……//回調(diào)函數(shù)中再調(diào)用自己 CCCallFuncND::create(this,callfuncND_selector(Hero::autoMoveCallBack),(void*)false),spawnAct,CCCallFuncND::create(this,callfuncND_selector(Hero::autoMoveCallBack),(void*)true),NULL); hero->runAction(movAction);}荷葉荷葉類設(shè)計,是游戲的核心模塊之一,是游戲中荷葉對象的展示以及和主角進行功能交互和反饋,主要包括主角進入后的旋轉(zhuǎn),和對數(shù)據(jù)的體現(xiàn)。荷葉使用的圖片紋理如圖4.3荷葉紋理圖集。圖4.3荷葉紋理圖集荷葉繼承自cocos2d-x的Node類,并且添加很多額外的屬性:旋轉(zhuǎn)動作是否完成,當前坐標位置,荷花屬性等等。核心代碼如下:classLotus:publiccocos2d::Node{private: boolrotIsDone;//旋轉(zhuǎn)是否完成public: cocos2d::Pointpos;//位置 LotusSprite*lotus;//圖像精靈 unsignedcharlotusType;//荷花類型1-5 unsignedcharrotStatus;//當前旋轉(zhuǎn)狀態(tài)0-3 GotoDirgotoDir;//可以走的通的方向4 unsignedcharrotType;//旋轉(zhuǎn)方向0為逆時針 unsignedcharisVictory;//是否是勝利荷花即終點 ……核心方法:1.構(gòu)造函數(shù)(Lotus):主要初始化荷葉所必須的核心數(shù)據(jù),以及根據(jù)數(shù)據(jù)初始化位置以及轉(zhuǎn)向和對紋理進行選擇性加載和創(chuàng)建。核心代碼如下:Lotus::Lotus(Pointp,unsignedcharlt,unsignedcharrs,unsignedcharv,unsignedcharrotTp):pos(p),lotusType(lt),isVictory(v),rotType(rotTp){ CCString*lotusName; if(rotTp==0) { lotusName=CCString::createWithFormat("Lotus_%d.png",lt); }else { lotusName=CCString::createWithFormat("Lotus1_%d.png",lt); }Autosf=CCSpriteFrameCache::getInstance()->getSpriteFrameByName(lotusName->getCString()); lotus=LotusSprite::createWithSpriteFrame(sf); lotus->setAnchorPoint(ccp(0.5f,0.5f)); lotus->setPosition(p); rotIsDone=true; rotStatus=0; isbeDir=aNull; rot(rs);}2.旋轉(zhuǎn)方法(rot):讓荷葉進行旋轉(zhuǎn)的方法,外部進行調(diào)用即可按照默認的屬性進行正確的旋轉(zhuǎn),并且提供擴展的方法,可以強制改變旋轉(zhuǎn)的次數(shù)和方向。如果已經(jīng)在旋轉(zhuǎn)的狀態(tài)下,則不進行旋轉(zhuǎn)。核心代碼如下:voidLotus::rot(unsignedcharn,booldir){//默認逆時針方向旋轉(zhuǎn) if(!rotIsDone)return; floatangle=0; if(rotType==0) { rotStatus=(rotStatus+n)%4; angle=-90.0f; } else { rotStatus=(4+rotStatus-n)%4; angle=90.0f; } if(!dir) {//程序強制指定方向 rotStatus=(rotStatus-n)%4; angle=90.0f; } CCRotateBy*rotareBy=CCRotateBy::create(ROT_SPEED,n*angle); cocos2d::CCAction*rotAction=CCSequence::create( CCCallFuncND::create(this,callfuncND_selector(Lotus::rotActionIsDoneCallBack),…… lotus->runAction(rotAction); …… 地圖地圖模塊,游戲的核心模塊之一,地圖作為游戲場景的主要表現(xiàn)方式,并且承載了荷葉和主角對象,每一個關(guān)卡的關(guān)卡數(shù)據(jù)都由地圖保存著,關(guān)卡的數(shù)據(jù)包括主角的起始位置和目標終點的位置,背景紋理樣式,所有荷葉對象的位置信息、種類信息以及旋轉(zhuǎn)朝向信息。1.地圖的配置說明:地圖使用TiledMap設(shè)計地圖。主要設(shè)計荷葉的鋪設(shè)位置,和設(shè)置主角起點位置和終點位置。1.兩個圖層:(1)物件層:放置物件,目前只有一個物件勝利標示。(2)背景層:放置背景瓦塊圖片。2.兩個對象層:(1)主角對象層:放置主角出場的位置,即起點位置對象。(2)荷葉對象層:放置荷葉對象。參見圖4.4地圖層示意圖。圖4.4地圖層示意圖鋪設(shè)荷葉對象,目標終點物件和對象,主角起點對象。如圖4.5地圖鋪設(shè)示意圖以及屬性設(shè)置示意圖。圖4.5地圖鋪設(shè)以及屬性設(shè)置示意圖在游戲中讀取TiledMap導(dǎo)出的配置文件,獲取所有的對象,并獲取對象類型,對象的位置屬性,旋轉(zhuǎn)屬性等等,從而創(chuàng)建出TiledMap描述的所有對象,并放置在對應(yīng)的位置。2.地圖類的設(shè)計,是游戲的核心模塊之一,地圖包含了所有的荷葉信息以及主角的起始位置,目標終點位置,在實例化的時候需要把所有的荷葉也實例化出來并且按照他的位置添加到地圖上,還有主角和終點擺放的位置。地圖類沒有繼承自任何類,是一個獨立的類,有很多的屬性:原生TiledMap對象,以及主角,荷葉容器等等。核心代碼如下:classTiledMap{private: cocos2d::PointHeroAnchorPos; cocos2d::PointHeroPos;public: cocos2d::TMXTiledMap*tiledMap; cocos2d::Vector<Lotus*>lotus; floatminScale; cocos2d::Pointpos; cocos2d::PointminPos;……地圖類有一些重要的方法:1.初始化方法(init):用來初始化地圖的所有核心數(shù)據(jù),創(chuàng)建所有的荷葉并且放到合適的位置,擺放主角的位置,等等。核心代碼如下:傳入地圖的索引即關(guān)卡,然后通過關(guān)卡的編號來加載對應(yīng)的地圖:boolTiledMap::init(intmapIndex){ SizevisibleSize=Director::getInstance()->getVisibleSize(); CCASSERT(mapIndex<=MAP_SIZE&&mapIndex>0,"Invalid mapIndex!"); CCString*mapName=CCString::createWithFormat("Map/map_%d.tmx",mapIndex); tiledMap=TMXTiledMap::create(mapName->getCString());……地圖可以進行縮放,但是縮放的最小比例是讓地圖的最小邊和屏幕的最小邊相等,因此縮放的最小比例是通過地圖的原有尺寸的最小邊計算得出的。…… floatsx=visibleSize.width/(tiledMap->getMapSize().width*tiledMap->getTileSize().width); floatsy=visibleSize.height/(tiledMap->getMapSize().height*tiledMap->getTileSize().height); minScale=sx>sy?sx:sy;……獲取所有的荷葉對象數(shù)據(jù)進行荷葉的創(chuàng)建以及把它們添加到地圖類中的荷葉容器中,供后面方便使用。把主角的數(shù)據(jù)讀出來并且創(chuàng)建在正確的位置上?!?floatTILE_SIZE=(tiledMap->getTileSize().width); autoobjGroups=tiledMap->getObjectGroup("Lotus"); autoobjs=objGroups->getObjects(); CCASSERT(objs.size()>0,"notfindlotusinLotusGroupfromTiledMap!"); for(auto&obj:objs) { ValueMap&dict=obj.asValueMap();floatx=dict["x"].asFloat()+TILE_SIZE/2.0f;floaty=dict["y"].asFloat()+TILE_SIZE/2.0f;floatwidth=dict["width"].asFloat();floatheight=dict["height"].asFloat(); unsignedcharlt=dict["lotusType"].asByte(); unsignedcharrs=dict["rotStatus"].asByte(); //讀不出來為0 unsignedcharisVictory=dict["victory"].asByte(); unsignedcharrotTp=dict["rotType"].asByte(); lotus.pushBack(newLotus(ccp(x,y),lt,rs,isVictory,rotTp)); } autoHeroObjGroups=tiledMap->getObjectGroup("Hero"); autoHeroObjs=HeroObjGroups->getObjects();……2.縮放更新方法(scaleUpdate):對地圖的縮放進行更新,并且更新所有的荷葉縮放和主角的縮放,以保證場景的所有東西的縮放一致。核心代碼如下:voidTiledMap::scaleUpdate(){ SizevisibleSize=Director::getInstance()->getVisibleSize(); tiledMap->setScaleX(SCALE_FACTOR); tiledMap->setScaleY(SCALE_FACTOR); minPos.x=(visibleSize.width-(tiledMap->getMapSize().width*SCALE_FACTOR*tiledMap->getTileSize().width)); minPos.y=(visibleSize.height-(tiledMap->getMapSize().height*SCALE_FACTOR*tiledMap->getTileSize().height));}3.坐標轉(zhuǎn)化方法(positionToTileCoord和positionToCocosCoord):用來進行cocos2d的坐標和TiledMap的坐標轉(zhuǎn)化,是對其他很多需要的地方提供方便的接口例如游戲場景的觸摸事件傳入的坐標是cocos2d的坐標,需要映射到TiledMap的坐標系中。核心代碼如下:CCPointTiledMap::positionToTileCoord(cocos2d::CCPointcocosCoord){ floatTILE_SIZE=(tiledMap->getTileSize().width); intx=(cocosCoord.x)/TILE_SIZE; inty=((tiledMap->getMapSize().height-1.0f)-int((cocosCoord.y)/TILE_SIZE)); returnccp(x,y);}CCPointTiledMap::positionToCocosCoord(cocos2d::CCPointtileCoord){ floatTILE_SIZE=(tiledMap->getTileSize().width); floatx=tileCoord.x*TILE_SIZE+TILE_SIZE/2.0f; floaty=((tiledMap->getMapSize().height-1.0f)-tileCoord.y)*TILE_SIZE+TILE_SIZE/2.0f; returnccp(x,y);}公共管理控制模塊1.動畫管理器:用來預(yù)加載游戲的動畫資源并且建立緩存,使得游戲能夠流暢的運行,并且在統(tǒng)一的的動畫管理器的管理下,動畫的創(chuàng)建以及獲取將會非常的方便和快捷。2.音效管理器:用來預(yù)加載音效的資源,并且建立緩存,使得游戲的的音效播放能夠流暢的進行,并且不會拖慢游戲的運行。在音效的統(tǒng)一管理之下,播放一個音效將會非常方便和快捷。3.其他公共全局函數(shù):提供常用的隨機數(shù)函數(shù),背景特效函數(shù),以及提示標簽函數(shù)等等。這些函數(shù)可以在其他任何文件無任何依賴的使用,非常方便和快捷。高級模塊部分簡單的使用一些當前比較前沿的技術(shù)在游戲中進行實踐和應(yīng)用,擴展游戲的功能以及讓這樣的小游戲更加炫酷,使得他的特效品質(zhì)提升一個檔次。這里使用的技術(shù)有Shader和廣告SDK。Shader簡單應(yīng)用Shader處理荷葉,為了讓荷葉看起來更加炫酷,這里為荷葉專門進行后期著色處理。荷葉看起來很難看如圖4.6荷葉紋理圖,荷葉中的黑色紋路很不雅觀。圖4.6荷葉紋理圖為此,可以使用Shader對荷葉進行著色處理,使得荷葉中的黑色紋路的顏色進行不斷的變化。由于荷葉紋理中的紋路都是黑色的并且不透明,所以可以借助這一點來編寫GLSL的片元著色器。首先通過頂點著色器傳入的紋理坐標將紋理的顏色取出,判斷是否是不透明的并且是黑色的,如果是那么就進行顏色處理,使用時間的一致變量對紅色以及綠色通道進行微調(diào)影響,這樣就可以使得黑色紋理的顏色隨著時間的變化而改變顏色了。GLSL片元著色器代碼:#ifdefGL_ESprecisionmediumpfloat;#endifvaryingvec4v_fragmentColor;varyingvec2v_texCoord;voidmain(){ vec4finalColor=texture2D(CC_Texture0,v_texCoord); if( finalColor.a>.2&& finalColor.r+finalColor.g+finalColor.b<.9 ) {//blackpart finalColor=vec4( sin(CC_Time.x*1.3521), cos(CC_Time.y/1.6278), 0.24157, 1. ); }gl_FragColor=finalColor;}在cocos2d-x中應(yīng)用:將本段代碼應(yīng)用到荷葉對象的紋理渲染中即可產(chǎn)生荷葉紋理中黑色部分將會隨著時間不斷的變化顏色。創(chuàng)建一個新的類型LotusSprite,使之繼承自cocos2d-x的Sprite類型,然后在初始化的時候?qū)⑺膕hader綁定替換為自己的著色器,由于這個著色器被頻繁使用,我們將這個著色器進行緩存,在LotusSprite初始化的時候取出來綁定即可。核心代碼如下:classLotusSprite:publicSprite……boolLotusSprite::initShader(){ autoprogram=ShaderCache::getInstance()->getGLProgram("Lotus"); program->updateUniforms(); this->setGLProgram(program); CHECK_GL_ERROR_DEBUG();……著色器需要在緩存之前執(zhí)行初始化、編譯、鏈接,然后放入map中使用鍵值對進行緩存,之后通過鍵值對取出由于已經(jīng)提前預(yù)先編譯鏈接了,所以后面的使用將會非常迅速。著色器的緩存代碼如下: GLchar*fragSource=(GLchar*)String::createWithContentsOfFile(FileUtils::getInstance()->fullPathForFilename("shader/Lotus.fsh").c_str())->getCString();autoprogram=newGLProgram();program->autorelease();program->initWithByteArrays(ccPositionTextureColor_noMVP_vert,fragSource);program->link();ShaderCache::getInstance()->addGLProgram(program,"Lotus");…… 廣告SDK接入為了讓游戲獲取收益,將會為游戲進行廣告的SDK接入,SDK有很多種廣告平臺和系統(tǒng)平臺,我們這里使用百度的廣告在芒果SDK的android平臺進行上線。1.上線將程序發(fā)布到百度開發(fā)者平臺上,首先需要注冊一個百度開發(fā)者賬號,然后將應(yīng)用程序提交到平臺的官網(wǎng)去進行驗收,驗收時需要準備許多資料,包括應(yīng)用的圖標、應(yīng)用的運行截圖、應(yīng)用的分類、應(yīng)用的語言類型、應(yīng)用的描述和簡介。如果通過驗收成功后將會得到一個應(yīng)用程序ID或者Key,有了這個ID或者Key,就可以進行廣告的接入了。如圖4.7上線申請示意圖。圖4.7上線申請示意圖2.廣告的接入當你的應(yīng)用在某個平臺通過上線申請后,將會獲取你的App對應(yīng)這個平臺的AppKey,然后就可以使用這個AppKey接入該平臺的廣告了。(1)首先下載該廣告平臺的SDK。需要到這個平臺的官網(wǎng),下載最新版本的SDK,SDK一般包含三個平臺,分別是IOSSDK、Unity3D、Cocos2d-x。這里我們需要下載Cocos2d-x的平臺對應(yīng)的SDK,如圖4.8SDK下載示意圖。圖4.8SDK下載示意圖(2)查看SDK接入文檔,按照文檔提示進行操作。幫助文檔有很多個,包括插屏廣告、橫幅廣告、開屏廣告等等,我們只選擇我們要進行接入的廣告幫助文檔進行配置即可。幫助文檔示意圖如圖4.9SDK幫助文檔示意圖。然后我們按照文檔中的說明來修改android工程的配置,將SDK的jar包引入android工程,對android工程的Manifest文件進行修改,將包名替換為我們應(yīng)用的包名、添加用戶權(quán)限、注冊一些服務(wù)、修改應(yīng)用的入口為廣告的SDK入口。圖4.9SDK幫助文檔示意圖(3)修改游戲工程源碼,添加SDK廣告接口。Android工程的核心代碼:……//填寫本app在百度的AppKeyAdsMogoInterstitialManager.setDefaultInitAppKey("520155a9e8ab4ca59993c191611284f8");AdsMogoInterstitialManager.setInitActivity(AdsMogoCoCos2dx.this);AdsMogoInterstitialManager.shareInstance().initDefaultInterstitial();……Cocos2d-x工程class中的C++代碼需要對應(yīng)android端的函數(shù)進行JNI調(diào)用,JNI在cocos2d-x中有一個組件JniHelper可以方便的使用。這里的接口都是針對android端設(shè)計的,所以這里的一切代碼都需要加上android平臺的預(yù)編譯宏。廣告類的頭文件,聲明C++中的方法,方法和android工程中的方法一致,這里都使用的是比較方便和簡單的靜態(tài)函數(shù)。對應(yīng)的C++代碼如下:#include"cocos2d.h"usingnamespacecocos2d;#if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)#include<jni.h>#include"platform/android/jni/JniHelper.h"#include<android/log.h>#endifclassMOGOAd{public: MOGOAd(); virtual~MOGOAd(); staticvoidshowBanner(); staticvoidhideBanner();……廣告類的實現(xiàn)文件,仍然使用預(yù)編譯宏來針對平臺編譯,然后使用JniHelper來調(diào)用android工程中的java方法。對應(yīng)的C++代碼如下:……voidMOGOAd::showBanner(){#if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID) JniMethodInfoshowBanner; boolisHave=JniHelper::getStaticMethodInfo(showBanner,"org/cocos2dx/cpp/AdsMogoCoCos2dx","showBannerStatic","()V"); if(!isHave){ CCLog("jni:showBannerStaticfalse"); }else{ showBanner.env->CallStaticVoidMethod(showBanner.classID,showBanner.methodID); }#endif}……至此,可以將MOGOAd類的廣告展示接口放到游戲應(yīng)用程序中,自行管理什么時候或者什么情況下展示什么廣告。比如在游戲開始界面顯示橫幅廣告,在選關(guān)場景顯示插屏廣告。如圖4.10橫幅廣告示意圖和圖4.11插屏廣告示意圖。圖4.10橫幅廣告示意圖由于插屏廣告面積巨大,甚至偶爾占滿整個屏幕(如圖4.11插屏廣告示意圖),為了避免引起玩家的反感,所以需要限制他顯示的概率和次數(shù)。一般的廣告SDK的插屏廣告都是設(shè)置每三次請求才會有一次請求會成功展示廣告。圖4.11插屏廣告示意圖系統(tǒng)測試由于游戲的測試不像網(wǎng)站或者其他的應(yīng)用軟件的測試,沒有數(shù)據(jù)的輸入,需要大量的真實操作,即使用黑盒測試對游戲的每個角落進行訪問和各種操作。首先需要在PC端進行實現(xiàn),然后在android端進行測試,最終以android端結(jié)果為準。測試將按照模塊以及功能分塊進行。測試的細節(jié)非常多,很容易疏漏。游戲場景測試檢測游戲中每個場景的視覺上效果是否正確和是否合適。場景的錯誤比較明顯,在視覺上可以直觀的看到容易排查。1.運行每一個場景,確保沒有任何圖片資源的缺失,因為圖片資源的缺失將會導(dǎo)致游戲直接崩潰。2.查看沒個場景和關(guān)卡的圖片資源的位置,大小,縮放,都是否正確,避免擺放位置偏離,縮放被拉伸,大小不合適等等情況。3.測試每個場景間的切換是否會沖突,每個按鈕的點擊是否會正確響應(yīng),狀態(tài)顯示是否正確。測試結(jié)果如表5.1場景測試結(jié)果。表5.1場景測試結(jié)果編號場景界面及狀態(tài)按鈕重要程度1游戲開始場景正確顯示正確響應(yīng)一般2選關(guān)場景正確顯示正確響應(yīng)非常重要3游戲場景正確顯示正確響應(yīng)非常重要游戲邏輯測試檢測游戲的運行的邏輯是否和預(yù)期的結(jié)果對應(yīng)。邏輯的錯誤常常比較隱晦,必須多次和反復(fù)的測試。1.多次點擊按鈕,應(yīng)當只響應(yīng)第一次。2.快速拖動屏幕,應(yīng)當正確流暢的響應(yīng)。3.多根手指拖動屏幕,應(yīng)當和單指拖動一致。4.同時快速點擊不同的對象,應(yīng)當只響應(yīng)一個地方。5.滑動時點擊,應(yīng)當無效。測試結(jié)果如表5.2游戲邏輯測試結(jié)果。表5.2游戲邏輯測試結(jié)果編號場景多次點擊多指拖動快速拖動同時點擊滑動點擊重要程度1游戲開始場景正確正確正確正確正確一般2選關(guān)場景正確正確正確正確正確非常重要3游戲場景正確正確正確正確正確非常重要游戲音效測試主要檢測音樂和音效是否正確以及正常播放,由于音效的播放失敗將不會引起游戲崩潰,只是沒有進行任何操作,所以音效的問題比較隱晦,值得注意。1.測試每一關(guān)的背景音樂是否正確。2.檢測各個動作的音效是否正確。3.檢測各個動作連續(xù)使用時音效是否正確混合或過渡。測試結(jié)果如表5.3游戲音效測試結(jié)果。表5.3游戲音效測試結(jié)果編號場景背景音樂音效重要程度1游戲開始場景正確正確一般2選關(guān)場景正確正確非常重要3游戲場景正確正確非常重要游戲數(shù)據(jù)測試主要檢測游戲
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度智能化停車場車位租賃管理服務(wù)合同模板4篇
- 2025年度智能家居廚房系統(tǒng)安裝工程合同規(guī)范版4篇
- 2024版牛奶飲料購銷合同
- 2025年度專業(yè)代理記賬服務(wù)合作協(xié)議書4篇
- 2025年度文化宣傳活動傳單派發(fā)合作協(xié)議范本4篇
- 2024年道路擴建工程爆破作業(yè)協(xié)議樣本一
- 2025年度水利樞紐沖孔灌注樁施工勞務(wù)分包合同規(guī)范4篇
- 2025年度新型瓷磚產(chǎn)品研發(fā)運輸合作協(xié)議4篇
- 2024石材開采與石材加工廠合作合同3篇
- 2025年度智能果園承包合作協(xié)議范本4篇
- 蒸汽回收方案
- 供應(yīng)鏈管理培訓(xùn)
- 2023小學(xué)道德與法治教師招聘考試試題與答案
- 氣管插管患者的壓力性損傷防治
- 湖南高職單招《綜合素質(zhì)測試》考試題庫(含答案)
- 失能老年人康復(fù)指導(dǎo)
- 數(shù)控加工技術(shù)-數(shù)控銑床的編程
- 內(nèi)科疾病的門診管理和科室建設(shè)
- 分子生物學(xué)在感染診斷中的應(yīng)用
- 供應(yīng)商年度評價內(nèi)容及評分表
- 山東省濟南市市中區(qū)2023-2024學(xué)年二年級上學(xué)期期中數(shù)學(xué)試卷
評論
0/150
提交評論