JavaME綜合實(shí)訓(xùn)報(bào)告_第1頁(yè)
JavaME綜合實(shí)訓(xùn)報(bào)告_第2頁(yè)
JavaME綜合實(shí)訓(xùn)報(bào)告_第3頁(yè)
JavaME綜合實(shí)訓(xùn)報(bào)告_第4頁(yè)
JavaME綜合實(shí)訓(xùn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Java ME綜合實(shí)訓(xùn)實(shí)訓(xùn)報(bào)告姓名 徐亮 學(xué)號(hào) 90917p35 系部 軟 件 學(xué) 院 專(zhuān)業(yè) 移 動(dòng) 應(yīng) 用 開(kāi) 發(fā) 軟件項(xiàng)目 Java ME 實(shí)訓(xùn) 指導(dǎo)教師 蔣理 完成時(shí)間 2020 年 6 月 28日 17 / 19文檔可自由編輯打印目 錄1 軟件項(xiàng)目概述11.1 J2ME開(kāi)發(fā)背景11.2 手機(jī)游戲設(shè)計(jì)11.3 項(xiàng)目名稱(chēng)12 項(xiàng)目策劃22.1 游戲需求分析22.2 游戲界面流程32.3 搭建平臺(tái)與環(huán)境32.3.1 平臺(tái)開(kāi)發(fā)環(huán)境32.3.2 關(guān)于Wireless ToolKit32.3.3 關(guān)于Java Appication Manager43 模塊分析與設(shè)計(jì)43.1 程序的總體流程43.2

2、 構(gòu)建游戲框架53.2.1 游戲啟動(dòng)界面53.2.2 游戲設(shè)置界面54 功能編碼實(shí)現(xiàn)54.1 游戲主類(lèi)MameCanvas64.2 通過(guò)游戲生成器生成的類(lèi)74.3 游戲設(shè)置模塊94.3.1 游戲難度設(shè)計(jì)94.3.2 游戲環(huán)境設(shè)計(jì)124.3.3 游戲獲勝失敗設(shè)計(jì)135 運(yùn)行與測(cè)試146 發(fā)布與運(yùn)營(yíng)157 實(shí)訓(xùn)小結(jié)168 參考文獻(xiàn)171 軟件項(xiàng)目概述1.1 J2ME開(kāi)發(fā)背景現(xiàn)在全球超過(guò)十億部移動(dòng)電話正在被使用,并且這個(gè)數(shù)目正在逐漸增加。在除美國(guó)之外的每個(gè)發(fā)達(dá)國(guó)家,擁有手機(jī)的人數(shù)比擁有計(jì)算機(jī)的人數(shù)還多。統(tǒng)計(jì)表明,截止到2010年3月底,我國(guó)移動(dòng)電話用戶(hù)已達(dá)7.8億戶(hù),普及率為58.4部/百人,大約平

3、均每月增加720萬(wàn)戶(hù)。2009年對(duì)計(jì)算機(jī)通信行業(yè)的開(kāi)發(fā)者和從業(yè)者來(lái)說(shuō)有太多的期待,而最值得期待的就是被稱(chēng)之為純技術(shù)驅(qū)動(dòng)的第三代移動(dòng)通信系統(tǒng)的商用。姑且不談純技術(shù)驅(qū)動(dòng)有沒(méi)有市場(chǎng),能不能成功,但是3G的商用必定會(huì)給移動(dòng)開(kāi)發(fā)插上飛翔的翅膀,而且J2ME(Java 2 Micro Edition)將是移動(dòng)開(kāi)發(fā)這場(chǎng)競(jìng)賽的領(lǐng)跑者。傳統(tǒng)手機(jī)出廠時(shí)均由硬件廠商固化程序,程序不能增加、刪除,有了錯(cuò)誤也不能更新、修改,若要增加新功能必須另?yè)Q一部手機(jī)。這極大的限制了手機(jī)軟件的發(fā)展。但隨著Java技術(shù)在手機(jī)上的應(yīng)用,成功地解決這一問(wèn)題。Java技術(shù)的開(kāi)放性、安全性和龐大的社會(huì)已有資源,以及其跨平臺(tái)性,即“編寫(xiě)一次,到

4、處運(yùn)行”的特點(diǎn),使Java技術(shù)成為這種智能手機(jī)軟件平臺(tái)的事實(shí)標(biāo)準(zhǔn)。1.2 手機(jī)游戲設(shè)計(jì)與傳統(tǒng)的主流的PC游戲相比,手機(jī)游戲的價(jià)值在于打發(fā)一些無(wú)聊的時(shí)間,作為一個(gè)移動(dòng)的娛樂(lè)終端,手機(jī)游戲施展身手的機(jī)會(huì)永遠(yuǎn)可能是在地鐵站、公交車(chē)或者是洗手間這些地方,也許在龐大的游戲行業(yè)里,手機(jī)游戲?qū)⒂肋h(yuǎn)扮演著一個(gè)邊緣者的角色,因?yàn)檎l(shuí)也不能指望一個(gè)人在家的時(shí)候用手機(jī)玩游戲或者看電影。但是手機(jī)游戲的市場(chǎng)是巨大的,即便是只有十分之一的用戶(hù)來(lái)購(gòu)買(mǎi)游戲,那也是一筆有利可圖的巨大利潤(rùn)。1.3 項(xiàng)目名稱(chēng)基于Netbeans IDE游戲生成器的一個(gè)簡(jiǎn)單的神秘園游的手機(jī)游戲SercetGarden。2 項(xiàng)目策劃2.1 游戲需求分析

5、本次實(shí)訓(xùn)程序采用面向?qū)ο蟮脑O(shè)計(jì)模式,對(duì)游戲中的所有物體賦予對(duì)象的概念和屬性,運(yùn)行程序后允許用戶(hù)選擇執(zhí)行選項(xiàng)菜單;在開(kāi)始游戲后先從外部文件載入游戲的圖片文件,對(duì)背景物體進(jìn)行繪圖,并使用雙緩存技術(shù)保證屏幕重繪的精確性和實(shí)施性;有序程序中設(shè)定的游戲區(qū)域可能會(huì)大于實(shí)際的手機(jī)屏幕,必須進(jìn)行合理的算法進(jìn)行虛擬游戲區(qū)域與實(shí)際游戲區(qū)域的轉(zhuǎn)換,保證程序的正確性;同時(shí),因?yàn)橛螒蛑杏斜姸嗟囊苿?dòng)對(duì)象,必須保證對(duì)游戲?qū)ο蠊δ芡暾那疤嵯拢M量減少系統(tǒng)的資源消耗,否則在資源有限的手機(jī)中運(yùn)行此程序是不現(xiàn)實(shí)的。根據(jù)游戲的特點(diǎn),該游戲的需求如下:1一個(gè)玩家精靈Karel2隨關(guān)卡而改變數(shù)量和速度的敵方蜘蛛3通用的游戲控制4難度增

6、加的關(guān)卡模式5合理的過(guò)關(guān)功能6游戲背景音樂(lè)7游戲背景燈2.2 游戲界面流程圖2-1 游戲界面流程2.3 搭建平臺(tái)與環(huán)境2.3.1 平臺(tái)開(kāi)發(fā)環(huán)境Microsoft Windows XP Professional SP3JDK(Java Development Kit)Netbeans IDE 6.8Sun Java Wireless Toolkit 2.5.2 for CLDC2.3.2 關(guān)于Wireless ToolKitWTK(Wireless Tool Kit)是Sun公司針對(duì)J2ME推出的用于手機(jī)和Palm等移動(dòng)設(shè)備的開(kāi)發(fā)包,是除手機(jī)廠商的專(zhuān)用開(kāi)發(fā)包外唯一的手機(jī)模擬器開(kāi)發(fā)包。它通用性高,

7、開(kāi)發(fā)出的應(yīng)用程序可保證能運(yùn)行在大部分設(shè)備上,而不像專(zhuān)用廠商具有一定的不兼容性。雖然它沒(méi)有強(qiáng)大的功能和完善的調(diào)試手段,但它提供運(yùn)行模擬器的最基本組件,是其他IDE需集成采用的必備元素。2.3.3 關(guān)于Java Appication Manager 手機(jī)中負(fù)責(zé)調(diào)配程序運(yùn)行資源的管理后臺(tái)是Java Application Manager。它所使用的傳輸媒體可以是紅外線、網(wǎng)絡(luò)、以及其他可用來(lái)傳輸?shù)拿襟w。Java Application Manager 會(huì)從網(wǎng)絡(luò)上下載代表該Application Suite的JAR文檔,接著在手機(jī)上安裝此MIDlet Suite,然后在手機(jī)開(kāi)始執(zhí)行該應(yīng)用程序。包括MID

8、Plet套件被安裝、升級(jí)、刪除、啟動(dòng)、停止以及常規(guī)的管理。3 模塊分析與設(shè)計(jì)3.1 程序的總體流程游戲的總體流程包含了整個(gè)游戲中的動(dòng)作切換過(guò)程,這些動(dòng)作切換包括:選擇進(jìn)入游戲或者退出游戲,游戲進(jìn)入主繪線程開(kāi)始繪制游戲界面以及在主繪線程中產(chǎn)生的各種命令和消息。下圖描述了游戲的主控流程。圖3-1程序的總體流程3.2 構(gòu)建游戲框架3.2.1 游戲啟動(dòng)界面為了增加軟件的專(zhuān)業(yè)化效果,為游戲軟件添加啟動(dòng)流程畫(huà)面可以增強(qiáng)游戲的商業(yè)化效果。下圖是該游戲啟動(dòng)畫(huà)面的流設(shè)計(jì)界面。圖3-2 SecretGardenVisualMIDlet 流設(shè)計(jì)視圖3.2.2 游戲設(shè)置界面游戲設(shè)置表單的設(shè)計(jì)分為游戲等級(jí),游戲環(huán)境的設(shè)

9、置。其中游戲等級(jí)分為四個(gè)等級(jí),分別是簡(jiǎn)單、高手、牛人、強(qiáng)人,依次對(duì)應(yīng)游戲的難度的增加,即游戲中蜘蛛的數(shù)量和速度隨著等級(jí)的增加而增加;游戲環(huán)境的設(shè)置有背景燈和背景音樂(lè)的開(kāi)啟。4 功能編碼實(shí)現(xiàn)本手機(jī)游戲中共有四個(gè)類(lèi),其中SecretGardenVisualMIDlet類(lèi)主要負(fù)責(zé)屏幕的切換,它們分別是,游戲啟動(dòng)的畫(huà)面閃屏,游戲菜單,設(shè)置,關(guān)于以及游戲屏幕等。游戲使用的類(lèi)是主類(lèi)MameCanvas以及SpriteRandomMovement類(lèi),游戲的設(shè)計(jì)類(lèi)是GameDesign類(lèi),游戲的類(lèi)UML圖如下圖所示:圖4-1游戲總體類(lèi)圖游戲的線程主要由三個(gè)部分組成:檢測(cè)鍵盤(pán)輸入(與玩家交互),更新游戲場(chǎng)景(處

10、理游戲邏輯),繪制畫(huà)布?;旧纤械?D游戲都可以按章這三個(gè)模塊來(lái)設(shè)計(jì),三個(gè)模塊相互聯(lián)系,按照模塊的思想來(lái)實(shí)現(xiàn)游戲線程將更加面向?qū)ο蠛捅阌诶斫狻H绻绦蜻\(yùn)行快于預(yù)期速度會(huì)使玩家感覺(jué)到抖動(dòng),從而影響游戲效果,因此還需要檢測(cè)每幀的運(yùn)行時(shí)間,如果過(guò)快則等待一段時(shí)間,如果過(guò)慢則掛起當(dāng)前線程允許其他線程執(zhí)行,線程的模塊如下圖所示:圖4-2游戲線程模塊圖4.1 游戲主類(lèi)MameCanvasMainCanvas 類(lèi)是游戲的主類(lèi),控制著游戲角色的出現(xiàn)和行動(dòng)方向,對(duì)游戲中的場(chǎng)景進(jìn)行布局,并對(duì)游戲角色和場(chǎng)景中的裝飾物進(jìn)行碰撞檢測(cè)。為了實(shí)現(xiàn)MIDP API中的游戲功能,將該類(lèi)繼承自GameCanvas,并修改代碼如

11、下:public MainCanvas() extendeds GameCanvas super(true); try this.setFullScreenMode(true); initThomas(difficulty); this.init(); catch (IOException ex) ex.printStackTrace(); private void init() throws IOException 由于為游戲軟件添加啟動(dòng)流程畫(huà)面,所以要將主類(lèi)MainCanvas的實(shí)例顯示到手機(jī)屏幕上,修改啟動(dòng)流程畫(huà)面SecretGardenVisualMIDlet類(lèi)如下:if (_sele

12、ctedElement.equals(loading) this.mainCanvas = new MainCanvas(); this.t = new Thread(mainCanvas); t.start(); d = Display.getDisplay(this); d.setCurrent(mainCanvas);4.2 通過(guò)游戲生成器生成的類(lèi)在NetBeans IDE提供的游戲生成器中可以設(shè)計(jì)游戲中地圖、場(chǎng)景和游戲角色等,通過(guò)簡(jiǎn)單的退拽可以減少不必要的重復(fù)勞動(dòng),我覺(jué)得這個(gè)是我認(rèn)為NetBeans IDE比其他IDE要好的主要原因之一。下圖是通過(guò)游戲生成起生成GameDesign類(lèi)并

13、經(jīng)過(guò)簡(jiǎn)單修改后形成的類(lèi)圖:圖4-3通過(guò)游戲生成起生成的GameDesign類(lèi)其中g(shù)etTopview_titles()方法用于讀取創(chuàng)建平鋪層的圖片資源;getBase()方法用于創(chuàng)建平鋪層Base,返回TiledLayer類(lèi)型對(duì)象。其中的數(shù)組tiles即為平鋪層的貼圖單元;updateLayerManagerForForest ()方法是游戲生成器的管理方法,用于管理場(chǎng)景中的平鋪層和動(dòng)畫(huà)層。其中的m是LayerManager類(lèi)型對(duì)象,是圖層的管理者。將生成好的場(chǎng)景Forset添加到MainCanvas中并顯示在屏幕上,在init()方法中初始化即可:private void init() th

14、rows IOException this.timer = new Timer(); this.gameDesign = new GameDesign(); this.waterAnimator = new TileAnimationTask( gameDesign.getWater(), gameDesign.AnimWaterWater, gameDesign.AnimWaterSeq001, true); this.timer.scheduleAtFixedRate( this.waterAnimator, 0, gameDesign.AnimWaterSeq001Delay); thi

15、s.tlThings = this.gameDesign.getThings(); this.tlTrees = this.gameDesign.getTrees(); this.tlWater = this.gameDesign.getWater(); this.tlBase = this.gameDesign.getBase(); this.tljian = this.gameDesign.getJiantiled(); this.lm = new LayerManager(); gameDesign.updateLayerManagerForForest(lm);4.3 游戲設(shè)置模塊為了

16、增加游戲的可玩性,在本游戲中設(shè)置了游戲的難度,游戲的背景燈和游戲的背景音樂(lè)。4.3.1 游戲難度設(shè)計(jì)表 4-1游戲難度的設(shè)計(jì)難度名稱(chēng)難度等級(jí)蜘蛛數(shù)量蜘蛛速度簡(jiǎn)單155高手2107牛人31510超人42015為了響應(yīng)為了響應(yīng)用戶(hù)在 setting 窗口的難度選擇,首先要在 getSetting()方法中添加以下代碼,以響應(yīng)用戶(hù)的選擇:setting.setItemStateListener(this)同時(shí),使 SecretGardenVisualMIDlet 擴(kuò)展 ItemStateListener 接口,并實(shí)現(xiàn)下方的itemStateChanged()方法: public void itemS

17、tateChanged(Item item) if (item = levelchoice) if (levelchoice.isSelected(0) difficulty = 1; else if (levelchoice.isSelected(1) difficulty = 2; else if (levelchoice.isSelected(2) difficulty = 3; else if (levelchoice.isSelected(3) difficulty = 4; 并修改 MainCanvas 構(gòu)造方法,在 try 中添加初始化 Thomas 的方法:initThomas

18、(difficulty)根據(jù)用戶(hù)不同的選擇生成的不同的Thomas對(duì)象組并初始化Thomas:private void initThomas(int numThomas) if (numThomas = 1) count = 5; speed = 5; spriteThomas = new Spritecount; spriteThomasAnimator = new SpriteAnimationTaskcount; spriteThomasRandomMovement = new SpriteRandomMovementcount; /此處省略用戶(hù)選擇其他的選項(xiàng)的代碼實(shí)現(xiàn) 修改 MainC

19、anvas 中的 init()方法:private void init() throws IOException this.spriteThomas = gameDesign.getThomasGroup(count); for (int i = 0; i count; i+) this.spriteThomasi.defineReferencePixel(8, 8); this.spriteThomasAnimatori = new SpriteAnimationTask(this.spriteThomasi, true); this.spriteThomasAnimatori.setMov

20、ing(true); this.timer.scheduleAtFixedRate( this.spriteThomasAnimatori, 0, gameDesign.ThomasSeqWalkHorizDelay); this.spriteThomasRandomMovementi = new SpriteRandomMovement( this, spriteThomasi, GameDesign.flagi, speed); this.spriteThomasRandomMovementi.setSequences( gameDesign.ThomasSeqWalkVert, Spri

21、te.TRANS_NONE, gameDesign.ThomasSeqWalkVert, Sprite.TRANS_ROT180, gameDesign.ThomasSeqWalkHoriz, Sprite.TRANS_ROT180, gameDesign.ThomasSeqWalkHoriz, Sprite.TRANS_NONE); (new Thread(spriteThomasRandomMovementi).start(); 在 GameDesign 中添加 getThomasGroup()構(gòu)造方法: public Sprite getThomasGroup(int count) th

22、rows java.io.IOException GameDesign.countThomas=count; Random rm = new Random(); for (int i = 0; i count; i+) flagi = Math.abs(rm.nextInt() % 4; if (ThomasGroupi = null) ThomasGroupi = new Sprite(getTopview_tiles(), 16, 16); switch (flagi) case 0: ThomasGroupi.setFrameSequence(ThomasSeqWalkVert); br

23、eak; /此處省略其他case 語(yǔ)句 return ThomasGroup; 4.3.2 游戲環(huán)境設(shè)計(jì)背光燈是手機(jī) LCD 發(fā)出的燈光,在 Java ME中可以通過(guò) flashBacklight()方法設(shè)置背光燈的照亮?xí)r間。在 itemStateChanged()方法中添加以下監(jiān)聽(tīng)代碼:public void itemStateChanged(Item item) if (item = environmentchoice) if (environmentchoice.isSelected(0) Display.getDisplay(this).flashBacklight(40000); e

24、lse Display.getDisplay(this).flashBacklight(0); 游戲的音效對(duì)游戲至關(guān)重要,好的游戲聲音可以增強(qiáng)手機(jī)游戲的效果。MIDP 2.0 支持mid 格式和 wav 格式聲音的播放。在Java ME 中可以通過(guò) javax.microedition.media 包中提供的方法播放背景音樂(lè)。在 itemStateChanged()方法中添加以下代碼:public void itemStateChanged(Item item) if (item = environmentchoice) if (environmentchoice.isSelected(1)

25、isplaymusic = true; else isplaymusic = false; 修改 MainCanvas 構(gòu)造方法,添加播放背景音樂(lè)的功能:public MainCanvas(boolean isplaymusic) if (isplaymusic) try player = Manager.createPlayer(getClass().getResourceAsStream(/res/bg.mid), audio/midi); player.realize(); player.setLoopCount(-1); player.start(); catch (Exception

26、 e) e.printStackTrace(); 4.3.3 游戲獲勝失敗設(shè)計(jì)為了刺激游戲玩家,可以為游戲添加獲勝和失利的判斷。在本游戲中,如果玩家獲得場(chǎng)景中的寶劍,即為獲勝;如果玩家不小心碰到爬蟲(chóng),則失利。修改 MainCanvas 中的碰撞檢測(cè)方法 spriteCollides(),在其中添加玩家獲取寶劍后獲勝的判斷和玩家碰到爬蟲(chóng)失利的判斷:public boolean spriteCollides(Sprite sprite) if (sprite = this.spriteKarel) if (this.spriteKarel.collidesWith(this.tljian, tru

27、e) this.showAlert(null, midlet.getSvgMenu().getSvgCanvas(), /res/win.png, ); this.stop(); for (int i = 0; i count; i+) if (this.spriteKarel.collidesWith(this.spriteThomasi, true) this.showAlert(null, midlet.getSvgMenu().getSvgCanvas(), /res/gameover.png, ); this.stop(); /精靈Thomas 的碰撞檢測(cè) for (int i =

28、0; i count; i+) if (this.spriteThomasi.collidesWith(this.spriteKarel, true) this.showAlert(null, midlet.getSvgMenu().getSvgCanvas(), /res/gameover.png, ); this.stop(); return sprite.collidesWith( sprite = this.spriteKarel ? this.spriteThomas0 : this.spriteKarel, true) | sprite.collidesWith(this.tlTh

29、ings, true) | sprite.collidesWith(this.tlTrees, true) | sprite.collidesWith(this.tlWater, true) | sprite.getX() 0 | sprite.getY() (this.tlBase.getWidth() - sprite.getWidth() | sprite.getY() (this.tlBase.getHeight() - sprite.getHeight(); 5 運(yùn)行與測(cè)試一個(gè)完整的開(kāi)發(fā)周期通常包括:編輯源代碼 - 打包 - 安裝 - 運(yùn)行 - 測(cè)試。Netbeans IDE能自動(dòng)對(duì)MIDlet套件進(jìn)行打包。打包產(chǎn)生兩個(gè)文件,即一個(gè) MIDlet描述符JAD和一個(gè)MIDlet套件JAR。描述符是一個(gè)JAD文件,包含有關(guān) MIDlet套件的信息。JAR包含組成MIDlet套件的類(lèi)文件和資源。在下載整個(gè)JAR之前,設(shè)備可以使用該描述符了解有關(guān)應(yīng)用程序的信息,這在內(nèi)存匱乏、帶寬極缺的無(wú)線環(huán)境中很值得重視。通過(guò)Netbeans IDE運(yùn)行該手機(jī)游戲程序生成的游戲界面如下圖所示:圖5-1啟動(dòng)進(jìn)入游戲的各個(gè)畫(huà)面6 發(fā)布與運(yùn)營(yíng)在Java當(dāng)中,會(huì)有Class文件被反編譯之后,程序代碼就很容易被解析出來(lái)的弱點(diǎn)。Netbeans IDE中就提供了

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論