手機(jī)版WPS 手機(jī)版wps免費(fèi)下載
2022-11-29
更新時(shí)間:2022-04-17 13:08:21作者:未知
隨著智能手機(jī)的發(fā)展,許多游戲也不斷的在手機(jī)中出現(xiàn)、更新,比如先前比較火的植物大戰(zhàn)僵尸,憤怒的小鳥(niǎo)等等。游戲的本質(zhì)就是在屏幕上不斷地顯示和更新圖片,只不過(guò)不是胡亂地更新,而是根據(jù)程序邏輯來(lái)控制。一款完整的游戲需要多方面的知識(shí),比如游戲的創(chuàng)意、背景、故事情節(jié)、游戲音效,游戲風(fēng)格、游戲類(lèi)型、運(yùn)行速度、適配機(jī)型等。而且,游戲的開(kāi)發(fā)需要策劃、美工、程序、測(cè)試的協(xié)同工作和默契配合完成的。
如果你對(duì)開(kāi)發(fā)Android平臺(tái)游戲感興趣,那么你需要了解很多東西。如果你有些許開(kāi)發(fā)經(jīng)驗(yàn),想要以開(kāi)發(fā)跨平臺(tái)游戲或表現(xiàn)出色的Android小游戲。那么你就要學(xué)習(xí)學(xué)習(xí)下面任務(wù)易提供的一些知識(shí)了。
學(xué)習(xí)應(yīng)用程序架構(gòu)
理解Android應(yīng)用程序架構(gòu)也是件非常重要的事情。如果你不學(xué)習(xí)這個(gè)方面的內(nèi)容,可能會(huì)使游戲完成后問(wèn)題的修改變得很困難。你需要理解應(yīng)用程序、活動(dòng)、意圖以及它們之間的相互聯(lián)系。Google在架構(gòu)方面已經(jīng)提供了許多有價(jià)值的信息。真正重要的是,要理解游戲?yàn)槭裁葱枰恢挂粋€(gè)活動(dòng)以及這對(duì)設(shè)計(jì)良好用戶(hù)體驗(yàn)的意義。我們接下來(lái)要探討的就是活動(dòng)生命周期。
獲得SDK
開(kāi)發(fā)Android平臺(tái)的首個(gè)步驟是獲得Android SDK(游戲邦注:即軟件開(kāi)發(fā)工具包)。SDK包含核心庫(kù)、模擬器、工具和代碼范例。我強(qiáng)烈推薦使用Eclipse和Android Eclipse插件。如果你只面向Android平臺(tái),那么專(zhuān)門(mén)供Java Developers使用的Eclipse IDE是個(gè)很好的工具。如果這是你的首個(gè)Java開(kāi)發(fā)項(xiàng)目,你可以下載整個(gè)Java SE Development Kit(游戲邦注:簡(jiǎn)稱(chēng)“JDK”),因?yàn)樗阈枰糜趹?yīng)用認(rèn)證和部署的工具。
學(xué)習(xí)活動(dòng)生命周期
活動(dòng)生命周期由Android操作系統(tǒng)管理。你的活動(dòng)將根據(jù)操作系統(tǒng)的指令創(chuàng)建、回訪、暫停和摧毀。正確處理這些事件對(duì)構(gòu)建有著良好行為的應(yīng)用程序非常重要,這樣應(yīng)用才能正確地滿(mǎn)足用戶(hù)的意圖。在你開(kāi)始設(shè)計(jì)游戲之前,有必要先知道所有這些內(nèi)容的運(yùn)轉(zhuǎn)方式,這會(huì)減少你將來(lái)調(diào)試和重新設(shè)計(jì)的時(shí)間。對(duì)于多數(shù)應(yīng)用程序來(lái)說(shuō),使用默認(rèn)設(shè)置就可以了。但是對(duì)游戲來(lái)說(shuō),你可能需要考慮打開(kāi)SingleInstance功能。當(dāng)處在默認(rèn)設(shè)置下時(shí),Android會(huì)在合適的時(shí)候自動(dòng)創(chuàng)建新活動(dòng)實(shí)例。對(duì)于游戲來(lái)說(shuō),你可能只想要單個(gè)游戲活動(dòng)實(shí)例。這也等于提示你需要如何來(lái)管理內(nèi)容狀態(tài),但是對(duì)我來(lái)說(shuō),它解決了某些資源管理問(wèn)題,所以應(yīng)當(dāng)考慮入列。
主循環(huán)
是否擁有主循環(huán)取決于你編寫(xiě)的游戲類(lèi)型。如果你的游戲與時(shí)間無(wú)關(guān),或者如果游戲只會(huì)對(duì)用戶(hù)的行為做出反應(yīng),沒(méi)有用戶(hù)輸入視覺(jué)場(chǎng)景就不會(huì)發(fā)生改變,那么你或許不需要主循環(huán)。如果你編寫(xiě)的是動(dòng)作游戲或帶有動(dòng)畫(huà)、計(jì)時(shí)器或其他自動(dòng)運(yùn)轉(zhuǎn)內(nèi)容的游戲,那么你應(yīng)當(dāng)認(rèn)真考慮使用主循環(huán)。
游戲的主循環(huán)指以特定順序運(yùn)轉(zhuǎn)子系統(tǒng),通常會(huì)盡可能提升每秒主循環(huán)的次數(shù)。你的主循環(huán)需要在它自己的線程上運(yùn)行。原因在于,Android有個(gè)主UI線程,如果主循環(huán)不在自己的線程上運(yùn)行,那么UI線程就會(huì)受游戲影響,導(dǎo)致Android OS無(wú)法完成普通的更新任務(wù)。執(zhí)行順序通常是:狀態(tài)、輸入、AI、物理、動(dòng)畫(huà)、音效和視頻。
更新?tīng)顟B(tài)意味著管理狀態(tài)改變,比如游戲結(jié)束、角色選擇或下個(gè)關(guān)卡。通常情況下,你需要在一個(gè)狀態(tài)上等待數(shù)秒鐘時(shí)間,狀態(tài)管理的任務(wù)應(yīng)當(dāng)是處理這個(gè)延遲并設(shè)置時(shí)間過(guò)后的下個(gè)狀態(tài)。
輸入是指來(lái)自用戶(hù)的任意按鍵、滾動(dòng)或觸碰。在處理物理前完成這個(gè)方面的內(nèi)容是很重要的,因?yàn)檩斎胪鶗?huì)影響到物理效果,所以先處理輸入會(huì)讓游戲顯得更為靈敏。在Android應(yīng)用中,輸入事件來(lái)自于主UI線程,所以你必須通過(guò)代碼來(lái)緩沖輸入,這樣你的主循環(huán)才能適時(shí)將其捕獲。這并不是個(gè)很困難的任務(wù)。所有需要做的就是為下次用戶(hù)輸入確定區(qū)域,用onKeyPressed或onTouchEvent將下次用戶(hù)動(dòng)作設(shè)置到該區(qū)域中。在特定游戲狀態(tài)下,所有的有效輸入都需要進(jìn)行輸入更新,讓物理端處理針對(duì)該輸入的響應(yīng)問(wèn)題。
AI更新類(lèi)似于用戶(hù)決定接下來(lái)要“按”的按鍵。學(xué)習(xí)如何編寫(xiě)AI不是這篇文章的主題,但基本想法是,AI將像用戶(hù)那樣按動(dòng)按鍵。這也將被物理更新捕捉并做出響應(yīng)。
物理更新可能是真正的物理,也可能不是。對(duì)于動(dòng)作游戲而言,要點(diǎn)在于同時(shí)考慮上次更新時(shí)間、此次更新時(shí)間、用戶(hù)輸入和AI輸入,決定游戲中所有內(nèi)容的位置以及是否有碰撞發(fā)生。對(duì)于你可以看到對(duì)象抓取和滑動(dòng)的游戲,物理更新還需要處理對(duì)象的互動(dòng)或者讓它下落到指定的位置。對(duì)于問(wèn)答游戲,它還需要決定答案是否正確?;蛟S你使用的是其他的名稱(chēng),但是每款游戲的游戲引擎中都需要有處理上述內(nèi)容的部分,在這篇文章中我將其稱(chēng)為“物理”。
動(dòng)畫(huà)并不只是在游戲中加入gif這么簡(jiǎn)單。你需要讓游戲在恰當(dāng)?shù)臅r(shí)候播放每幀動(dòng)畫(huà)。但是,它也不像聽(tīng)起來(lái)那么難。要保持isDancing、 danceFrame和lastDanceFrameTime等狀態(tài)區(qū)域允許動(dòng)畫(huà)更新以決定是否轉(zhuǎn)向下一幀。這就是動(dòng)畫(huà)更新所做的所有工作。真正負(fù)責(zé)呈現(xiàn)動(dòng)畫(huà)改變的是視頻更新。
音效更新負(fù)責(zé)觸發(fā)音效、暫停音效、改變音量和音調(diào)。通常在編寫(xiě)游戲時(shí),音效更新會(huì)生成一連串字節(jié)傳輸給音效緩沖器,但是Android自行管理音效,所以針對(duì)游戲開(kāi)發(fā),你可以使用SoundPool或MediaPlayer。它們都有一點(diǎn)敏感,但是要知道,由于存在某些低層次的執(zhí)行細(xì)節(jié),小而低位速率的 OGG也能產(chǎn)生最棒的運(yùn)行表現(xiàn)和穩(wěn)定性。
視頻更新要考慮游戲狀態(tài)、玩家位置、分?jǐn)?shù)和狀況等內(nèi)容,在屏幕繪制所有內(nèi)容。如果使用主循環(huán),那么你可以考慮使用SurfaceView,進(jìn)行“推送”繪制。如果使用其他視圖,視圖本身能夠調(diào)用繪制運(yùn)轉(zhuǎn),這樣主循環(huán)就無(wú)需負(fù)責(zé)這項(xiàng)工作。SurfaceView能夠提供最高的每秒幀數(shù),最適合帶有動(dòng)畫(huà)或在屏幕上有移動(dòng)物體的游戲。視頻更新應(yīng)該做的工作是,獲取游戲狀態(tài),并及時(shí)繪制在屏幕上。除此之外,其他的自動(dòng)化內(nèi)容最好由其他更新任務(wù)來(lái)完成。
3D還是2D?
在你開(kāi)始開(kāi)發(fā)游戲前,你需要決定是制作3D還是2D游戲。2D游戲要學(xué)習(xí)的內(nèi)容較少,通常更容易獲得良好的表現(xiàn)。3D游戲需要更多的深層次數(shù)學(xué)技能,如果不注意的話,可能會(huì)產(chǎn)生表現(xiàn)問(wèn)題。如果你想要添加比方形和圓圈更加復(fù)雜的形狀,那么無(wú)論選擇3D或2D,都需要使用3D Studio和Maya等模型工具。Android支持使用OpenGL進(jìn)行3D編程,網(wǎng)絡(luò)上有許多很不錯(cuò)的OpenGL教程可供閱讀。
構(gòu)建簡(jiǎn)單且高質(zhì)量方法
開(kāi)發(fā)開(kāi)始時(shí),確保不要編寫(xiě)又大又長(zhǎng)的方法。如果你采用我在上文中描述的主循環(huán)樣式,這樣得出的方法應(yīng)當(dāng)較為簡(jiǎn)單。你編寫(xiě)的每個(gè)方法都應(yīng)當(dāng)能夠完成某項(xiàng)特定任務(wù),而且不可發(fā)生錯(cuò)誤。比如,如果你需要在游戲中洗牌,那么就應(yīng)當(dāng)編寫(xiě)名為“shuffleCards”的方法,而且這個(gè)方法就是用來(lái)完成洗牌這個(gè)動(dòng)作。
這是個(gè)可用于所有軟件開(kāi)發(fā)的編程方法,但是在游戲開(kāi)發(fā)中顯得特別重要。在狀態(tài)化的即時(shí)系統(tǒng)中,調(diào)試會(huì)變得非常困難。要保持方法簡(jiǎn)單輕巧,最好是保證每個(gè)方法只有1個(gè)目標(biāo)。如果你需要為場(chǎng)景繪制背景,那么你可能需要名為“drawBackground”的方法。這樣會(huì)讓你的游戲開(kāi)發(fā)變得像搭建方塊一般,你可以隨時(shí)根據(jù)自己的需要添加新方塊,同時(shí)不會(huì)讓代碼變得難以理解。
學(xué)習(xí)應(yīng)用程序架構(gòu)
理解Android應(yīng)用程序架構(gòu)也是件非常重要的事情。如果你不學(xué)習(xí)這個(gè)方面的內(nèi)容,可能會(huì)使游戲完成后問(wèn)題的修改變得很困難。你需要理解應(yīng)用程序、活動(dòng)、意圖以及它們之間的相互聯(lián)系。Google在架構(gòu)方面已經(jīng)提供了許多有價(jià)值的信息。真正重要的是,要理解游戲?yàn)槭裁葱枰恢挂粋€(gè)活動(dòng)以及這對(duì)設(shè)計(jì)良好用戶(hù)體驗(yàn)的意義。我們接下來(lái)要探討的就是活動(dòng)生命周期。
效能是關(guān)鍵
運(yùn)行效果是所有游戲遇到的主要問(wèn)題。我們的目標(biāo)是讓游戲的反應(yīng)速度盡可能快,游戲的運(yùn)行看起來(lái)盡可能流暢。Canvas.drawLine等某些方法可能執(zhí)行較慢。而且,在每幀的主畫(huà)布上繪制全屏位圖也會(huì)耗費(fèi)大量時(shí)間。要讓?xiě)?yīng)用實(shí)現(xiàn)最好的表現(xiàn),平衡這些動(dòng)作就成了必要之舉。確保對(duì)資源進(jìn)行良好的管理,使用各種技巧,實(shí)現(xiàn)用最少的CPU完成任務(wù)。如果表現(xiàn)不好,即便是最棒的游戲也顯得乏味無(wú)趣。通常情況下,人們不會(huì)對(duì)反應(yīng)緩慢的應(yīng)用抱有好感。
總的來(lái)說(shuō),發(fā)布更新和錯(cuò)誤修復(fù)是開(kāi)發(fā)者們的另一塊重要的工作,特別是獨(dú)立的開(kāi)發(fā)者。有些android小游戲開(kāi)發(fā)一旦完成就鮮有更新,除非有重大的錯(cuò)誤修復(fù)。而其它游戲,特別是那些比較重量級(jí)以及社交成分較多的游戲,則會(huì)在更新上花費(fèi)較多精力,這時(shí)獨(dú)立開(kāi)發(fā)者們也發(fā)現(xiàn)用戶(hù)們的反饋是很寶貴的資源。