張 敏
?
基于java的手機(jī)游戲設(shè)計(jì)的研究
張 敏
(武漢信息傳播職業(yè)技術(shù)學(xué)院 湖北 武漢 430223)
隨著手機(jī)、ipad、筆記本電腦等移動(dòng)設(shè)備的普及,Java功能在移動(dòng)設(shè)備上的普遍應(yīng)用更為明顯,基于Java功能的手機(jī)增值服務(wù)日益體現(xiàn)出其影響力,J2ME(Java 2 Micro Edition)技術(shù)應(yīng)運(yùn)而生,它主要定位在消費(fèi)性電子產(chǎn)品上,完美地解決了設(shè)備的智能化、多樣化,極大地豐富了人們的生活,為人們提供了快捷的咨詢和服務(wù)。
本文介紹了一個(gè)基于J2ME的手機(jī)游戲的設(shè)計(jì)過程。本文采用開源的Eclipse為基本的開發(fā)環(huán)境,以J2ME開發(fā)套件為基本開發(fā)工具,設(shè)計(jì)了名為瘋狂賽車的java小游戲。本文從游戲的需求分析開始,詳細(xì)描述了設(shè)計(jì)概要,并且對(duì)于游戲的具體實(shí)現(xiàn)過程作了詳細(xì)的闡述,最后也對(duì)游戲的調(diào)試做了簡(jiǎn)單的介紹。本文為一個(gè)完整的基于J2ME的手機(jī)游戲設(shè)計(jì)過程,有助于推廣到基于java的其他手機(jī)增值業(yè)務(wù)的開發(fā)和設(shè)計(jì)。
Java;J2ME;MIDP2.0;手機(jī)游戲
隨著手機(jī)的日漸普及,基于手機(jī)的應(yīng)用越來越多:QQ、MP3、視頻、攝像、導(dǎo)航定位、新聞快訊、電子錢包等等。這些應(yīng)用都是為了滿足人們的需要而開發(fā)的,都取得了不同程度的發(fā)展。而其中的一個(gè)應(yīng)用——手機(jī)游戲已經(jīng)成為整個(gè)視頻游戲領(lǐng)域發(fā)展速度最快的部分。手機(jī)游戲給人以極大的想象空間,激勵(lì)著眾多知名企業(yè)和創(chuàng)業(yè)團(tuán)隊(duì)加入到手機(jī)游戲的產(chǎn)業(yè)之中,其擁有的巨大的商業(yè)潛力,在不久的將來必將成為游戲行業(yè)的下一個(gè)金礦。盡管每個(gè)手機(jī)游戲都不貴,但是巨大的使用量將使得這個(gè)市場(chǎng)商機(jī)無限。隨著3G時(shí)代的到來,手機(jī)游戲必然有著不可限量的發(fā)展前景。
眾所周知,現(xiàn)在的手機(jī)具備了越來越多的新的功能,比如藍(lán)牙、視頻、GPS等,當(dāng)然游戲功能也越來越強(qiáng)大,而開發(fā)這些手機(jī)應(yīng)用軟件主要依賴于這些平臺(tái):J2ME、Brew、Symbian。J2ME平臺(tái)的優(yōu)點(diǎn)是開發(fā)速度快、周期短、支持的手機(jī)多、開發(fā)資源豐富、移動(dòng)已商用。而缺點(diǎn)是代碼可以反編譯。各廠商SDK不兼容,同一廠商的不同型號(hào)手機(jī)不兼容,限制比較多,不完全支持Socket,執(zhí)行效率低。BREW的優(yōu)點(diǎn):API功能較強(qiáng),速度較快,聯(lián)通已商用。缺點(diǎn)是目前只支持C,支持手機(jī)不多。Symbian的優(yōu)點(diǎn)是獨(dú)立操作系統(tǒng),功能強(qiáng)大,支持幾乎所有新功能,是未來手機(jī)的趨勢(shì)。缺點(diǎn)是開發(fā)難度很大,成本相對(duì)較高,各種資源較少。
綜上比較以上幾種開發(fā)平臺(tái)的優(yōu)缺點(diǎn),可以發(fā)現(xiàn)J2ME具有移植性強(qiáng)、開發(fā)速度快、跨平臺(tái)、開發(fā)資源豐富的優(yōu)勢(shì),選用J2ME平臺(tái)來進(jìn)行手機(jī)游戲的開發(fā)是很理想的選擇。這個(gè)版本針對(duì)資源有限的電子消費(fèi)產(chǎn)品的需求精簡(jiǎn)核心類庫,并提供了模塊化的架構(gòu)讓不同類型產(chǎn)品能夠隨時(shí)增加支持的能力。由此看來使用J2ME平臺(tái)來開發(fā)游戲項(xiàng)目是最理想不過的。本文采用開源的Eclipse為基本的開發(fā)環(huán)境,以J2ME開發(fā)套件為基本開發(fā)工具,完成游戲的設(shè)計(jì)。
(1)安裝JDK:由于Eclipse自身并沒有附帶Java運(yùn)行環(huán)境JDK,所以安裝前要先安裝JDK。本文采用的是jdk1.6.0_10。
(2)Eclipse的安裝:本文采用的Eclipse版本為Eclipse3.2。Eclipse安裝很簡(jiǎn)單,只需要將下載的Eclipse壓縮包解壓到任何一個(gè)選定的目錄即可。本文將其解壓到C:Program Fileseclipse。本文采用的是中文開發(fā)環(huán)境,因此需將Eclipse的語言包NLpack-eclipse-SDK-3.0解壓到與Eclipse相同的目錄下,即C:Program Fileseclipse即可。
(3)安裝并配置EclipseME插件:EclipseME作為Eclipse一個(gè)插件,致力于幫助開發(fā)者開發(fā)J2ME應(yīng)用程序。但是EclipseME并沒有為開發(fā)者提供移動(dòng)設(shè)備模擬器。所以后面還要進(jìn)行加載WTK模擬器。
(4)加載WTK(j2me_wireless_toolkit-2_1_01-windows.exe):WTK是Sun J2ME Wireless Toolkit的簡(jiǎn)稱。它是sun公司所提供的一個(gè)無線開發(fā)工具包,該工具包包含生成工具、實(shí)用程序及設(shè)備仿真器。它向用戶提供一個(gè)集成環(huán)境,把程序的編譯、連接和運(yùn)行等操作全部集中在一個(gè)環(huán)境上運(yùn)行,使用十分方便。它通用性高,開發(fā)出的應(yīng)用程序可保證能運(yùn)行在大部分設(shè)備上。由于EclipseME并沒有為開發(fā)者提供移動(dòng)設(shè)備模擬器。所以,為了能為開發(fā)者提供一種無縫的統(tǒng)一集成開發(fā)環(huán)境,還需要將手機(jī)廠商的模擬器配置到Eclipse開發(fā)環(huán)境中。
(1)建立工程及文件
在Eclipse平臺(tái)上順序選擇“文件”、“新建”、“J2ME”、“J2ME Midlet Suite”,然后命名該工程名為:helloworld。與此同時(shí)在上述工程下建立一個(gè)MIDlet文件:helloworld。操作:在Eclipse平臺(tái)上右鍵單擊工程名,然后在彈出的快捷菜單中順序選擇“新建”、“J2ME”、“J2ME Midlet”,接著命名該文件名為:helloworld,將上述代碼復(fù)制到helloworld文件下并保存。
(2)調(diào)試運(yùn)行
在Eclipse平臺(tái)上,右鍵單擊工程名,然后再彈出的快捷菜單中順序選擇“運(yùn)行方式”、“運(yùn)行”、“Wireless Toolkit Emulator”。右擊“Wireless Toolkit Emulator”選項(xiàng),在彈出的快捷菜單中選擇“new”,彈出上面那個(gè)對(duì)話框。指定helloworld為可執(zhí)行MIDlet程序的入口文件,然后單擊“應(yīng)用”,最后單擊“運(yùn)行”運(yùn)行。Eclipse自動(dòng)啟動(dòng)WTK的模擬器,顯示“歡迎J2ME&EclipseME!”。
每個(gè)MIDlet程序都必須有一個(gè)主類,該類必須繼承自MIDlet。它控制著整個(gè)程序的運(yùn)行,并且可以通過相應(yīng)函數(shù)從程序描述文件中獲取相關(guān)的信息。該類中擁有可以管理程序的創(chuàng)建、開始、暫停、結(jié)束的函數(shù)。
本游戲主要實(shí)現(xiàn)的功能是小車躲避障礙物(炸彈),具體是通過方向鍵控制小車的方向(上、下、左、右)從而躲避自上而下降落的炸彈,在游戲開始的同時(shí),開始計(jì)分,到最終程序檢測(cè)到有碰撞事件發(fā)生時(shí)(也即游戲結(jié)束時(shí))停止計(jì)分,退出游戲同時(shí)顯示得分。要實(shí)現(xiàn)以上功能必須解決以下這些問題:
4.1.1關(guān)于碰撞檢測(cè)的算法
發(fā)現(xiàn)在碰撞發(fā)生時(shí)其實(shí)并不是兩個(gè)物體的相切時(shí),而是還隔有一小段距離就發(fā)生碰撞事件,原因是采用了矩形和矩形進(jìn)行碰撞:一般規(guī)則的物體碰撞都可以處理成矩形碰撞,實(shí)現(xiàn)的原理就是檢測(cè)兩個(gè)矩形是否重疊。但是矩形碰撞只是一種比較粗糙的碰撞檢測(cè)方法,因?yàn)楹芏鄬?shí)際的物體可能不是一個(gè)規(guī)則的矩形。解決方法是:
(1)盡量使用物體是矩形的圖片;
(2)采用圓形和圓形的碰撞,因?yàn)樵跀?shù)學(xué)上對(duì)于兩個(gè)圓形是否發(fā)生重疊,有計(jì)算兩個(gè)圓心之間的距離的公式。那么條件就變?yōu)椋河?jì)算兩個(gè)圓心之間的距離是否小于兩個(gè)圓的半徑之和。
4.1.2邊界檢測(cè)
通過程序控制賽車和炸彈在屏幕上的出現(xiàn)位置,避免越界。這個(gè)問題只需通過比較坐標(biāo)與屏幕的大小即可實(shí)現(xiàn)。如程序:炸彈的邊界檢測(cè):
if (x < bombWidth) x = bombWidth;
if (x > gameCtrl.width - bombWidth) x = gameCtrl.width - bombWidth;
if (gameCtrl.bombPosY[i] > gameCtrl.height + bombHeight / 2)
gameCtrl.bombCanUse[i] = false; // 炸彈出界檢測(cè):
4.1.3動(dòng)態(tài)背景畫面的實(shí)現(xiàn)
用數(shù)組循環(huán)在屏幕上出現(xiàn)的虛線。程序在后面的“游戲背景的制作”中會(huì)有詳細(xì)講解。
4.1.4計(jì)分功能
該功能是通過一個(gè)計(jì)數(shù)器來實(shí)現(xiàn)。在每次碰撞檢測(cè)過后判斷是否gameCtrl.score++。
本程序采用面向?qū)ο蟮脑O(shè)計(jì)模式,對(duì)游戲中的所有物體賦予對(duì)象的概念和屬性。運(yùn)行程序后允許用戶選擇執(zhí)行選項(xiàng)菜單,在開始游戲后將先從外部文件載入賽車和炸彈的圖文件,對(duì)背景的所有物體進(jìn)行繪圖。在主程序運(yùn)行的線程中,實(shí)時(shí)反映整個(gè)游戲的進(jìn)行狀態(tài)。用戶控制的賽車運(yùn)行在主線程中,隨屏幕刷新的頻率而移動(dòng)。
本游戲共建立三個(gè).java文件,分別是:RacingMIDlet.java、GameCtrl.java和NextFrame.java。程序一開始執(zhí)行是先從主類RacingMIDlet.java來開始。這個(gè)類從MIDlet類繼承過來,在程序的開始函數(shù)startApp()中調(diào)用下面函數(shù)來暫時(shí)顯示一個(gè)屏幕對(duì)象。
Alert splashScreen = new Alert(null,"歡迎來玩瘋狂賽車,方向鍵控制方向",logo,AlertType.INFO);
當(dāng)Alert對(duì)象超時(shí),系統(tǒng)會(huì)顯示另一個(gè)Displayable對(duì)象。
Displayable current = display.getCurrent();
display.setCurrent(current);
這兩個(gè)語句把程序的執(zhí)行轉(zhuǎn)向GameCtrl.java文件來。而這個(gè)類繼承CommandListener,這個(gè)CommandListener類用來截獲按鈕點(diǎn)擊事件,也就是監(jiān)聽按鈕的點(diǎn)擊,然后調(diào)用相應(yīng)的方法:
(1)當(dāng)點(diǎn)擊“退出”時(shí),游戲退出。
(2)當(dāng)點(diǎn)擊“開始”時(shí),程序轉(zhuǎn)到GameCtrl類中的paint(Graphics g)函數(shù)中去,這個(gè)函數(shù)是用來繪制游戲界面的,里面包括游戲背景的繪圖,炸彈和賽車的繪圖。然后轉(zhuǎn)到initialize()函數(shù)來初始化一些變量。接著轉(zhuǎn)到keyPressed(int keyCode)來偵聽并響應(yīng)按鍵操作。然后NextFrame類中的run()開始進(jìn)行邊界檢測(cè)及碰撞檢測(cè),當(dāng)檢測(cè)到碰撞事件時(shí)游戲結(jié)束,定時(shí)器停止工作,返回gameCtrl.score值,顯示分?jǐn)?shù)。見圖4.1所示。
圖4.1 程序流程圖
(1)游戲進(jìn)入前的選擇
本設(shè)計(jì)程序進(jìn)入時(shí),首先載入畫面的不是游戲運(yùn)行狀態(tài),而是提供選項(xiàng),當(dāng)選擇開始時(shí)正式運(yùn)行。這部分由RacingMIDlet.java文件實(shí)現(xiàn)。在類RacingMIDlet中的startApp()函數(shù)中,隨即調(diào)用了Displable的setCurrent()函數(shù)將當(dāng)前屏幕設(shè)置為Displayable current = display.getCurrent()。另外需要建立一個(gè)Alert對(duì)象,其用于顯示提示、警告,還有版權(quán)信息等告之用戶信息的臨時(shí)閃現(xiàn)的屏幕,它可作為setCurrent的參數(shù),提前顯示在最終需要顯示的屏幕前。GameCtrl繼承了接口commandListener,這樣就可以使用高級(jí)界面的Command按鈕。繼承了CommandListener的類必須擁有commandAction(),以決定對(duì)按鍵采取什么樣的行為。即按鈕事件觸發(fā)后需執(zhí)行的函數(shù)。在設(shè)置好Commandlistener后,需要調(diào)用setCommandListener()以將按鈕事件激活。鍵盤事件中,可用getCommandType()返回的Command類型來確定選擇的是什么按鈕。keyPressed(int keyCode)用來處理游戲按鍵操作。repaint()重新繪圖。
(2)游戲的登陸界面制作
這個(gè)寫在GameCtrl.java文件中,通過使用高級(jí)界面的Command按鈕來實(shí)現(xiàn)游戲的“開始”、“退出”命令。繼承了CommandListener的類必須擁有commandAction(),以決定對(duì)按鍵采取什么樣的行為。即按鈕事件觸發(fā)后需執(zhí)行的函數(shù)。在設(shè)置好Commandlistener后,需要調(diào)用setCommandListener()以將按鈕事件激活。
再用commandAction(Command arg0,Displayable arg1)函數(shù)來控制游戲的開始與結(jié)束。登陸界面圖畫則通過paint(Graphics g)實(shí)現(xiàn)。
(3)游戲背景的制作
本游戲要在手機(jī)屏幕上顯示一段公路,具體說就是在屏幕上畫兩條線,這要用到繪圖類Graphics。首先設(shè)置背景顏色setColor(255, 255, 255)為白色并填充屏幕fillRect()。然后用setColor(0,0,25)確定繪圖所用顏色為藍(lán)色,并用g.drawLine()實(shí)現(xiàn)繪制線條的功能。為了能表現(xiàn)出賽車奔馳的場(chǎng)面,故而采用虛線繪制(LineMode=true)。
(4)賽車的控制
操作非常簡(jiǎn)單,僅僅是通過手機(jī)方向鍵控制賽車的上、下、左、右移動(dòng)。
首先偵聽按鍵操作,語句如下:keyPressed(int keyCode);
獲得按鍵操作后,然后將按鍵操作復(fù)制給專門的游戲按鍵。
int gameAction = getGameAction(keyCode);
接著進(jìn)行按鍵響應(yīng),執(zhí)行按鍵操作,從而控制賽車的移動(dòng)。
switch (gameAction)
{ case RIGHT;carPos += 5; case LEFT:carPos -= 5;
case DOWN:carPoc += 5;case UP:carPoc -= 5;}
(5)炸彈的運(yùn)行及控制
首先判斷炸彈是否在屏幕上出現(xiàn),采用如下判斷語句。if (gameCtrl.bombCanUse[i] == false),若炸彈沒顯示時(shí)設(shè)置初始位置,顯示后水平位置固定。
if(x > bombWidth) x = bombWidth;
if(x > gameCtrl.width - bombWidth) x > gameCtrl.width – bombWidt;
然后將炸彈設(shè)置在虛擬屏幕,gameCtrl.bombPosY[i] = -y;
接著開始炸彈的下移。gameCtrl.bombPosY[i] += 6;
與此同時(shí)要檢測(cè)炸彈是否出界,若沒出界則繼續(xù)執(zhí)行下降操作,否則返回到初始時(shí)刻重新設(shè)置初始位置。
本文采用開源的Eclipse為基本的開發(fā)環(huán)境,使用J2ME為開發(fā)套件,依次安裝了JDK1.6.0_10、Eclipse3.2、EclipseME1.7.9、WTK2.1_01這四個(gè)軟件及插件搭建起手機(jī)游戲開發(fā)平臺(tái)——J2ME,從而進(jìn)行手機(jī)游戲——瘋狂賽車的設(shè)計(jì)與實(shí)現(xiàn)過程。本文分別介紹了該游戲設(shè)計(jì)的背景及相關(guān)技術(shù),開發(fā)工具及平臺(tái)的搭建,手機(jī)游戲的需求分析、概要設(shè)計(jì)和詳細(xì)設(shè)計(jì)。
[1]陳旭東.《J2ME應(yīng)用教程》[M].北京:清華大學(xué)&北京交通大學(xué)出版社,2006
[2]汪永松.《J2ME手機(jī)高級(jí)編程》[M].北京:機(jī)械工業(yè)出版社,2009
with the mobile phone, tablet, the popularity of mobile devices such as notebook computer, Java features on mobile devices widely used is more apparent, mobile value-added services based on Java function increasingly reflects its influence, J2ME (Java 2 Micro Edition) technology arises at the historic moment, its main role in consumer electronics, perfectly solve the intelligent equipment, diversified, have greatly enriched the life of people, provides people with quick consulting and services.
This article introduces the design process of a mobile game based on J2ME. This article USES the open source Eclipse as a basic development environment, and USES the J2ME development suite as the basic development tool to design a Java mini game called crazy racing. In this paper, from the beginning of the game needs analysis, detailed design profiles, and for the game in detail on the concrete implementation process, finally also debugging made simple introduction to the game. This paper is a complete j2me-based mobile game design process, which can be extended to the development and design of other mobile value-added services based on Java.
Java J2ME MIDP2.0 mobile game.
10.19551/j.cnki.issn1672-9129.2017.11.030
TP311.52
A
1672-9129(2017)11-0025-02