甘 泉,王啟明
(平頂山學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,平頂山467000)
移動(dòng)平臺(tái)上射擊類(lèi)游戲設(shè)計(jì)開(kāi)發(fā)
甘 泉,王啟明
(平頂山學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,平頂山467000)
在移動(dòng)應(yīng)用設(shè)計(jì)開(kāi)發(fā)過(guò)程中,基于類(lèi)的設(shè)計(jì)成為應(yīng)用開(kāi)發(fā)的主流方法,類(lèi)的設(shè)計(jì)方法及運(yùn)用直接影響應(yīng)用開(kāi)發(fā)過(guò)程及結(jié)果。在Android移動(dòng)應(yīng)用平臺(tái)上,采用面向?qū)ο蟮囊苿?dòng)應(yīng)用開(kāi)發(fā),以雷電游戲?yàn)槔?,著重探討?lèi)的設(shè)計(jì),開(kāi)發(fā)一個(gè)射擊類(lèi)游戲。在應(yīng)用設(shè)計(jì)過(guò)程中,分析了系統(tǒng)接口類(lèi)的特點(diǎn)。通過(guò)系統(tǒng)分析,設(shè)計(jì)和分析類(lèi)、類(lèi)間關(guān)系和類(lèi)的組織。為了便于團(tuán)隊(duì)開(kāi)發(fā),提高類(lèi)的復(fù)用性,提出了類(lèi)的優(yōu)化建議。最后實(shí)現(xiàn)并發(fā)布游戲,為移動(dòng)應(yīng)用平臺(tái),尤其是Android平臺(tái)應(yīng)用開(kāi)發(fā)提供參考。
移動(dòng)平臺(tái);應(yīng)用開(kāi)發(fā);游戲設(shè)計(jì)
Android操作系統(tǒng)因其穩(wěn)定性、開(kāi)放性、低成本等特點(diǎn),受到廣大手機(jī)游戲開(kāi)發(fā)者關(guān)注。Android平臺(tái)提供給開(kāi)發(fā)者的開(kāi)發(fā)類(lèi)庫(kù),即Framework層提供的API和LIBRARIES層提供的一些類(lèi)庫(kù),決定了移動(dòng)應(yīng)用的開(kāi)發(fā)條件、開(kāi)發(fā)過(guò)程和開(kāi)發(fā)結(jié)果[1]。Android平臺(tái)游戲設(shè)計(jì)是基于Android手機(jī)平臺(tái),運(yùn)用Java語(yǔ)言,使用2D游戲引擎的部分技術(shù),開(kāi)發(fā)出針對(duì)于Android平臺(tái)的手機(jī)應(yīng)用[2]。這里以雷電游戲的開(kāi)發(fā)為例,研究Android平臺(tái)上移動(dòng)應(yīng)用中類(lèi)的特性、組織、設(shè)計(jì)。基于Android平臺(tái)借助面向?qū)ο蟮募夹g(shù),對(duì)基礎(chǔ)構(gòu)件和常用設(shè)計(jì)進(jìn)行抽象和實(shí)現(xiàn)[3]。
在游戲設(shè)計(jì)中,需要尋找實(shí)體。這里使用OOAD大師Peter Coad所提出的事物模式[4]來(lái)尋找實(shí)體。在一個(gè)游戲中,可以把“游戲的運(yùn)行”看作一個(gè)事務(wù),圍繞著這個(gè)事務(wù)來(lái)分析出系統(tǒng)中涉及的類(lèi)。對(duì)于一個(gè)游戲來(lái)說(shuō),通常需要有主角,敵人,以及Boss。在雷電游戲中,由于是射擊類(lèi)游戲,因此需要子彈這一實(shí)體類(lèi)。至此共分析出4個(gè)和事物相關(guān)的實(shí)體類(lèi),分別命名為Player,Enemy,Boss,Bullet。除此之外,一個(gè)游戲還需要菜單和游戲背景,分別定義為:GameMenu和GameBackground。在實(shí)現(xiàn)過(guò)程中,可能還會(huì)出現(xiàn)其他的類(lèi),將在實(shí)現(xiàn)部分具體分析和實(shí)現(xiàn)。
在Android平臺(tái)上開(kāi)發(fā)游戲,需要使用系統(tǒng)預(yù)定義的回調(diào)接口,以及系統(tǒng)提供的方便游戲開(kāi)發(fā)的一些類(lèi)。本論文在游戲框架中將要介紹的類(lèi)Activity就是其中的一個(gè)。此外,對(duì)于游戲開(kāi)發(fā),另一個(gè)比較重要的類(lèi)是SurfaceView,它提供了局部重繪功能[5],這極大的方便了游戲程序員對(duì)屏幕的控制。這里又分析出兩個(gè)由系統(tǒng)提供的類(lèi),至此,對(duì)系統(tǒng)的實(shí)體分析工作基本完成。
3.1 Activity類(lèi)
在Android提供的API中,Android提供了Activity類(lèi),這個(gè)類(lèi)實(shí)際上是一個(gè)接口,也可以說(shuō)是系統(tǒng)的回調(diào)函數(shù)。程序員只要在這個(gè)類(lèi)中實(shí)現(xiàn)系統(tǒng)定義的接口,完成相應(yīng)的編碼,當(dāng)系統(tǒng)調(diào)用該類(lèi)時(shí),就會(huì)實(shí)現(xiàn)程序員所期望的效果。在Android應(yīng)用程序設(shè)計(jì)中,最需要關(guān)注的就是Activity類(lèi)的生命周期,利用其生命周期,實(shí)現(xiàn)諸如程序的運(yùn)行,暫停及數(shù)據(jù)的存儲(chǔ)等一系列操作。
圖1 Activity的生命周期
圖1就是Activity的一個(gè)生命周期,在這個(gè)游戲的實(shí)現(xiàn)過(guò)程中,需要復(fù)寫(xiě)Activity預(yù)定義的方法,實(shí)現(xiàn)系統(tǒng)和游戲框架間的通信。對(duì)數(shù)據(jù)的存儲(chǔ)一般在onPause()中實(shí)現(xiàn),對(duì)數(shù)據(jù)的恢復(fù)在onResume()中實(shí)現(xiàn),以確保程序在各種情況下能讀取到正確的數(shù)據(jù)。
3.2 框架設(shè)計(jì)
游戲?qū)崿F(xiàn)通常是基于一個(gè)循環(huán),在這個(gè)循環(huán)中處理用戶(hù)輸入,實(shí)現(xiàn)游戲邏輯和各種角色繪制。結(jié)構(gòu)清晰的循環(huán)可以方便游戲的實(shí)現(xiàn)。在游戲雷電的實(shí)現(xiàn)中,使用如圖2的循環(huán)結(jié)構(gòu)。
圖2 游戲通常的框架[6]
圖2中,Input()函數(shù)用來(lái)接收用戶(hù)輸入,Logic()函數(shù)用來(lái)處理游戲邏輯,Paint()函數(shù)用來(lái)實(shí)現(xiàn)游戲繪制。再循環(huán)過(guò)程中,循環(huán)的頻率決定屏幕刷新頻率,從而影響游戲畫(huà)面的質(zhì)感。如使用每秒16幀的間隔會(huì)出現(xiàn)抖動(dòng),而50幀的間隔會(huì)使畫(huà)面更真實(shí)。刷新頻率受設(shè)備處理能力等影響,可根據(jù)具體需求而定,一般取值范圍為[16..50],在此,雷電游戲的實(shí)現(xiàn)使用了每秒20幀的間隔[7]。
3.3 游戲框架的實(shí)現(xiàn)
根據(jù)Activity類(lèi)和一般游戲框架,實(shí)現(xiàn)雷電游戲框架,其實(shí)現(xiàn)過(guò)程如下,游戲的后續(xù)實(shí)現(xiàn)將會(huì)在這個(gè)框架的基礎(chǔ)上,逐步擴(kuò)充。
(1)生成一個(gè)繼承Activity的類(lèi)MainActivity。
(2)創(chuàng)建一個(gè)繼承自SurfaceView的類(lèi)MySurfaceView,并在該類(lèi)中實(shí)現(xiàn)游戲的框架(見(jiàn)圖3中的loop片段)。
(3)在MySurfaceView的onCreate()方法中調(diào)用setContentView()方法,設(shè)置屏幕上要顯示的視圖為MySurfaceView中的內(nèi)容。
在MySurfaceView中定義的Input()、Logic()和Paint()方法中將調(diào)用其他類(lèi)中對(duì)應(yīng)的Input()、Logic()和Paint()方法。整個(gè)系統(tǒng)對(duì)象的交互過(guò)程如圖3所示。
由于在MySurfacView中實(shí)現(xiàn)的角色對(duì)象都繼承自Sprite,并且為了清晰顯示序列圖中的交互過(guò)程,圖3中通過(guò)使用多個(gè)Sprite對(duì)象代替Player、Enemy、Boss等對(duì)象,來(lái)顯示對(duì)象間的交互情況。同時(shí)在圖3中使用了OPT片段來(lái)顯示在MySurfaceView中游戲進(jìn)入不同狀態(tài)時(shí)系統(tǒng)的行為。由于在每個(gè)狀態(tài)中都執(zhí)行onInput(),onLogic()和onPaint()方法,所以圖3中省略了其他狀態(tài)時(shí)系統(tǒng)的行為。
圖3 游戲主體部分序列圖
4.1 類(lèi)的關(guān)系
在需求分析中通過(guò)需求實(shí)體,可以得到系統(tǒng)所需要的各個(gè)類(lèi)。靜態(tài)結(jié)構(gòu)設(shè)計(jì)階段就是分析游戲中各個(gè)類(lèi)間的關(guān)系,找出他們之間的關(guān)聯(lián),從而方便游戲的實(shí)現(xiàn)。系統(tǒng)各個(gè)類(lèi)間關(guān)系如圖4所示。
圖4 需求分析階段分析出來(lái)的類(lèi)
圖4中增加了一個(gè)Boom類(lèi),用于實(shí)現(xiàn)子彈的爆炸效果。隨后還要實(shí)現(xiàn)一個(gè)Rocker類(lèi)(在圖上給出)來(lái)實(shí)現(xiàn)一個(gè)屏幕上的游戲手柄,用來(lái)實(shí)現(xiàn)對(duì)游戲主角,即飛機(jī)的控制。
由于類(lèi)圖是對(duì)系統(tǒng)實(shí)體的抽象,并展現(xiàn)了各個(gè)抽象實(shí)體間的關(guān)聯(lián),例如,在MySurfaceView類(lèi)中只引用一個(gè)Player類(lèi),所以,MySurfaceView和Player是一對(duì)一關(guān)系;一個(gè)Player可以發(fā)射多顆子彈,所以這里Player類(lèi)和Bullet類(lèi)是一對(duì)多的關(guān)系,如圖5所示。
在實(shí)現(xiàn)過(guò)程中,一對(duì)一關(guān)聯(lián)可以通過(guò)在調(diào)用方引用單個(gè)類(lèi)的實(shí)例實(shí)現(xiàn),一對(duì)多關(guān)聯(lián)可以在調(diào)用方通過(guò)容器實(shí)現(xiàn),這里使用向量(Vector)來(lái)實(shí)現(xiàn)。
圖5 類(lèi)之間的關(guān)系
從敏捷開(kāi)發(fā)的觀點(diǎn)出發(fā),隨著項(xiàng)目的實(shí)施和需求的不斷變更,需要對(duì)項(xiàng)目進(jìn)行不斷更迭,這樣系統(tǒng)的靜態(tài)結(jié)構(gòu)也會(huì)出現(xiàn)一些變化,由于篇幅所限,這里不再討論更迭的過(guò)程,只給出項(xiàng)目類(lèi)圖的最終結(jié)構(gòu),如圖6所示。
圖6 項(xiàng)目最終靜態(tài)結(jié)構(gòu)
相對(duì)于圖4,圖6的變化是:將Gamemenu從MySufaceView中單獨(dú)分離出來(lái),并定義成單獨(dú)的一個(gè)類(lèi)MenuSurfaceView。其意義在于便于團(tuán)隊(duì)開(kāi)發(fā),很好的實(shí)現(xiàn)了分工和不同功能模塊的隔離,其次也可以使菜單類(lèi)MenusurfaceView得到重用。
4.2 類(lèi)的組織
為了便于實(shí)現(xiàn)以及代碼重用,需要對(duì)代碼進(jìn)行組織。根據(jù)每個(gè)類(lèi)在程序中的實(shí)現(xiàn)功能和邏輯的不同,將代碼分為四個(gè)包,如圖7所示。
圖7 系統(tǒng)包圖
其中各個(gè)包所對(duì)應(yīng)的職責(zé)如表1所示。
表1 各包包含類(lèi)的介紹
對(duì)于com.gan.game包實(shí)際上還可以進(jìn)行拆分,分成單獨(dú)的一個(gè)游戲邏輯包和游戲精靈包,這樣可以方便的對(duì)程序進(jìn)行擴(kuò)充,增加新的關(guān)卡。
5.1 菜單的實(shí)現(xiàn)
為了實(shí)現(xiàn)菜單選項(xiàng)和文字顯示效果,在游戲?qū)崿F(xiàn)過(guò)程中又定義了一個(gè)Button類(lèi)和一個(gè)Panle類(lèi)。Button和Panle類(lèi)與MenuSurfaceView間的靜態(tài)關(guān)系如圖8所示。Button類(lèi)的實(shí)現(xiàn)可以通過(guò)直接使用或者繼承系統(tǒng)提供的Button類(lèi),或者在Menusurface-View中直接自定義一個(gè)Button類(lèi),并實(shí)現(xiàn)其繪制。同理Panel類(lèi)的實(shí)現(xiàn)可以直接使用或者繼承系統(tǒng)提供的TextView類(lèi)。
圖8 菜單界面類(lèi)間的關(guān)系
5.2 背景的實(shí)現(xiàn)
滾屏背景的實(shí)現(xiàn)需要使用兩張相同的圖片,并使兩張圖片在垂直或者水平方向相接,然后不斷的交替出現(xiàn),從而實(shí)現(xiàn)屏幕的滾動(dòng)效果。在實(shí)現(xiàn)過(guò)程中要求使用圖片的高度應(yīng)該稍大于屏幕高度,當(dāng)一張圖片到達(dá)屏幕底部時(shí),立即將它移動(dòng)至其后繼的上方,如此反復(fù)以實(shí)現(xiàn)連續(xù)滾動(dòng)的效果,如圖9所示。
圖9 雷電游戲背景界面的實(shí)現(xiàn)
在程序中實(shí)現(xiàn)時(shí),滾動(dòng)效果是通過(guò)改變被繪制圖像左上角的Y坐標(biāo)來(lái)實(shí)現(xiàn)的。
5.3 游戲中各角色的實(shí)現(xiàn)
游戲中的Enemy,Boss,Player以及Bullet類(lèi)有很多相似處,如均有邏輯處理和繪制自身的能力,因此將這些方法抽象出來(lái),定義成一個(gè)超類(lèi),以方便游戲的實(shí)現(xiàn)。在2D游戲引擎中通常被稱(chēng)為Sprite。此外2D游戲引擎中還具有一些代表性的技術(shù),如碰撞檢測(cè),精靈動(dòng)畫(huà)等。也需要在Sprite類(lèi)中實(shí)現(xiàn),供其繼承類(lèi)使用。
在此以具有代表性的碰撞檢測(cè)技術(shù)為例。通常,在2D游戲中,常見(jiàn)的有兩種碰撞檢測(cè)技術(shù),即矩形碰撞檢測(cè)和圓形碰撞檢測(cè),此外對(duì)于要求較高的游戲還有像素級(jí)別的碰撞檢測(cè)。本游戲使用了矩形碰撞檢測(cè)技術(shù),就是把碰撞雙方的邊界都看成矩形,通過(guò)測(cè)試它們的邊界是否相交來(lái)檢驗(yàn)是否發(fā)生碰撞,其典型代碼實(shí)現(xiàn)如下所示:
5.4 觸屏手柄技術(shù)
智能移動(dòng)終端帶給人們觸屏操控的快感,在觸屏上進(jìn)行方向操作,比較典型的做法是在觸屏上設(shè)置一個(gè)虛擬鍵盤(pán),實(shí)現(xiàn)方向操作。這個(gè)虛擬鍵盤(pán)需要實(shí)現(xiàn)兩個(gè)功能。
5.4.1 小圓跟隨手指的運(yùn)動(dòng)限制在一定范圍內(nèi)
為實(shí)現(xiàn)小圓在大圓內(nèi)運(yùn)動(dòng)的效果,定義兩個(gè)同心圓,將這兩個(gè)同心圓的圓心設(shè)置為同一個(gè)點(diǎn),如圖10左圖所示。讓小圓隨著用戶(hù)的手指來(lái)回移動(dòng)。為實(shí)現(xiàn)這個(gè)目的,需要規(guī)定當(dāng)用戶(hù)手指的觸摸在大圓半徑范圍內(nèi)的時(shí)候,只改變小圓的圓心坐標(biāo),在大圓范圍外的時(shí)候,通過(guò)計(jì)算用戶(hù)手指所在點(diǎn)到大圓圓心的弧度,然后乘以大圓的半徑,這樣就保證小圓在大圓的范圍內(nèi),不會(huì)在屏幕上亂轉(zhuǎn),如圖10右圖所示。
圖10 游戲觸柄的原理
5.4.2 實(shí)現(xiàn)方向判斷
為實(shí)現(xiàn)對(duì)四個(gè)方向的判斷,需要使用數(shù)學(xué)上的三角函數(shù),判斷觸點(diǎn)相對(duì)于圓心的弧度,然后判斷該點(diǎn)的弧度是否在圖11所示各個(gè)方向的弧度范圍內(nèi)。規(guī)定每一個(gè)方向的弧度區(qū)域?yàn)镻I/4。通常在實(shí)現(xiàn)過(guò)程中以弧度表示角度。
圖11 游戲觸柄的數(shù)學(xué)原理
5.5 游戲主場(chǎng)景的實(shí)現(xiàn)
前述SurfaceView類(lèi)提供了游戲開(kāi)發(fā)所需要的局部屏幕重繪技術(shù),使得游戲開(kāi)發(fā)更加容易。在游戲的具體實(shí)現(xiàn)中讓MySurfaceView繼承SurfaceView類(lèi),并實(shí)現(xiàn)了callback和runable接口。callback接口是系統(tǒng)的一個(gè)回調(diào)接口,這樣系統(tǒng)就能實(shí)現(xiàn)對(duì)surfaceView在緩沖池中的操作,runable是一個(gè)線程的實(shí)現(xiàn),這樣主線程就可以使用其子線程的方法實(shí)現(xiàn)對(duì)該子線程實(shí)現(xiàn)類(lèi)的控制。
同時(shí),本游戲在MySurfacev類(lèi)中實(shí)現(xiàn)了整個(gè)游戲的邏輯,其游戲中各個(gè)角色的邏輯規(guī)則和描述如圖12和表2所示。
由于Android平臺(tái)增加了觸屏輸入方式,為實(shí)現(xiàn)對(duì)觸屏輸入的判斷及處理,這里的Input()方法會(huì)被拆分成OnKeyDown(),OnKeyUp(),OnTouchEvent()三個(gè)方法,其原理是一樣的。
圖12 雷電游戲的邏輯
表2 各個(gè)實(shí)體對(duì)應(yīng)的邏輯
需要注意的是,MySurfaceView是通過(guò)狀態(tài)機(jī)來(lái)對(duì)應(yīng)游戲的不同運(yùn)行,如游戲失敗時(shí)進(jìn)入Game_Lost狀態(tài),并顯示游戲失敗的界面;游戲勝利時(shí),進(jìn)入Game_Win狀態(tài),并顯現(xiàn)游戲勝利的界面。對(duì)該狀態(tài)機(jī)各個(gè)狀態(tài)的實(shí)現(xiàn)是通過(guò)定義不同的數(shù)值常量來(lái)實(shí)現(xiàn)的。
5.6 音效的實(shí)現(xiàn)
在Application層,MediaPlayer和SoundPool都可以用來(lái)播放聲音[8],但是兩者又有很大的區(qū)別。MediaPlayer類(lèi)既可以播放聲音又可以播放視頻,其最大的特色是基于狀態(tài)機(jī)實(shí)現(xiàn)的。該類(lèi)適合于播放比較大的音頻文件,如游戲的背景音樂(lè)。SoundPool類(lèi)可以同時(shí)播放多種聲音,正好符合游戲中同時(shí)播放多種音效的需要,但是其也有自身限制,就是不能播放太大(大于10K)的聲音文件,否則會(huì)出現(xiàn)內(nèi)存溢出。Android推薦在游戲中使用*.ogg和*.mid音頻文件。對(duì)聲音類(lèi)的實(shí)現(xiàn)主要通過(guò)com.gan. Sound包。
通過(guò)壓力測(cè)試工具monkey進(jìn)行壓力測(cè)試。這里只關(guān)注壓力測(cè)試。進(jìn)行壓力測(cè)試的主要目的是檢驗(yàn)程序中是否存在ANR(Application Not Response)錯(cuò)誤,以及其它一些像音頻文件過(guò)大等造成的內(nèi)存溢出問(wèn)題。測(cè)試結(jié)果如圖13所示。
圖13 壓力測(cè)試結(jié)果
按照Android提供的系統(tǒng)安全策略進(jìn)行程序發(fā)布。程序運(yùn)行時(shí)效果如圖14所示。
圖14 程序運(yùn)行時(shí)效果
在諸多移動(dòng)應(yīng)用平臺(tái)上,選擇Android作為游戲的實(shí)現(xiàn)平臺(tái)。在應(yīng)用開(kāi)發(fā)中,以類(lèi)的設(shè)計(jì)為主線,研究分析了Android平臺(tái)的系統(tǒng)架構(gòu)和組件模型,并剖析了一般游戲的框架結(jié)構(gòu),在此基礎(chǔ)上實(shí)現(xiàn)了一個(gè)適合Android平臺(tái)的游戲框架。參考常見(jiàn)2D游戲引擎的實(shí)現(xiàn)方法,使用了精靈動(dòng)畫(huà),碰撞檢測(cè)等典型技術(shù),運(yùn)用面向?qū)ο蟮姆椒▽?shí)現(xiàn)了一個(gè)名為雷電的射擊類(lèi)游戲。在開(kāi)發(fā)過(guò)程中注重類(lèi)的設(shè)計(jì),為移動(dòng)應(yīng)用平臺(tái),尤其是Android平臺(tái)應(yīng)用開(kāi)發(fā)提供了參考。
[1] 柯元旦.Android程序設(shè)計(jì)[M].北京:北京航空航天大學(xué)出版社,2009.
KE Yuan-dan.Android program design[M].Beijing:Beijing university of aeronautics and astronautics Press,2009.
[2] Creative Commons Attribution.Android Development document[EB/OL].Beijing:Developers,2012.http://developer.android.com/sdk/installing.html,2014-11-22.
[3] 陳淮.基于Android游戲開(kāi)發(fā)中常用類(lèi)庫(kù)的設(shè)計(jì)與實(shí)現(xiàn)[D].西安:西安電子科技大學(xué),2011.
Chen Huai.Based on the Android game development in the design and implementation of a common class library[D].Xi’an:Xidian University,2011.
[4] 李華明.Android游戲編程之從零開(kāi)始[M].北京:清華大學(xué)出版社,2012.
Li Hua-ming.Android game programming from scratch[M].Beijing:Tsinghua university,2012.
[5] Peter Coad.ObjectModels:Strategies,Patterns&Application[M].Yourdon Press,2008.
[6] 張鵬.3D手機(jī)游戲開(kāi)發(fā)實(shí)例教程[M].北京:電子工業(yè)出版社,2000.
Zhang Peng.3Dmobile game development instance tutorial[M].Beijing:Electronic industry Press,2000.
[7] Dave Shreiner.OpenGL Programming Guide[M].American:Addison-wesley,2009:23-24.
[8] Creative Commons Attribution.Android Development document[EB/OL].Beijing:Developers,2012.http://developer.android.com/guide/topics/media/index.html.2014-11-22.
Design and Development of Shooting Game in Mobile Platform
Gan Quan,Wang Qiming
(College of Computer Science and Technology,Pingdingshan University,Pingdingshan 467000,China)
In the process of the design and development for themobile application,the design based on the class becomes themainstream of application developmentmethod.The designmethod and usage of the class directly affect the application development process and result.In android mobile application platform,a shooter game,adopting the object-oriented mobile application development and focusing on the design of the class,is developed.In the process of application design,the features of the system interface classes are analyzed.Through system analysis,the classes,the relationship between them and its organization are analyzed and designed.In order to facilitate team development and improve the reusability of the class,the suggestions for the class optimization are put forward.Finally,the game is realized and released to provide the reference for application development inmobile application platform.
Mobile platform;Application development;Game Design
10.3969/j.issn.1002-2279.2015.03.016
TP312
A
1002-2279(2015)03-0054-06
甘泉(1980-),男,安徽省靈璧縣人,碩士研究生,講師,主研方向:算法分析等。
2014-11-28