基于Java的超級瑪麗游戲的設(shè)計與實現(xiàn)論文_第1頁
基于Java的超級瑪麗游戲的設(shè)計與實現(xiàn)論文_第2頁
基于Java的超級瑪麗游戲的設(shè)計與實現(xiàn)論文_第3頁
基于Java的超級瑪麗游戲的設(shè)計與實現(xiàn)論文_第4頁
基于Java的超級瑪麗游戲的設(shè)計與實現(xiàn)論文_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

畢業(yè)設(shè)計(論文)題目PAGE21分類號_______________密級________________UDC_______________學(xué)號____畢業(yè)設(shè)計(論文)論文題目基于Java的超級瑪麗游戲的設(shè)計與實現(xiàn)thesisTopic學(xué)生姓名學(xué)號所在院系專業(yè)班級導(dǎo)師姓名職稱完成日期年月日基于java的超級瑪麗游戲的設(shè)計與實現(xiàn)摘要近年來,Java作為一種新的編程語言,以其簡單性、可移植性和平臺無關(guān)性等優(yōu)點,得到了廣泛地應(yīng)用。J2SE稱為Java標(biāo)準(zhǔn)版或Java標(biāo)準(zhǔn)平臺。J2SE提供了標(biāo)準(zhǔn)的SDK開發(fā)平臺。利用該平臺可以開發(fā)Java桌面應(yīng)用程序和低端的服務(wù)器應(yīng)用程序,也可以開發(fā)Java

Applet程序?!俺壃旣悺庇螒蚴且粋€經(jīng)典的游戲,它因操作簡單、娛樂性強而廣受歡迎。本游戲中通過總結(jié)和分析JAVA游戲的開發(fā)流程和代碼功能的設(shè)計,采用面向?qū)ο蟮脑O(shè)計模式,對游戲中的所有物體賦予對象的概念和屬性。開發(fā)了一款超級瑪麗游戲,該游戲主要分為窗體類、場景類、馬里奧類、敵人類、障礙物類等幾個類。在主程序運行的線程中,用戶控制的超級瑪麗隨方向鍵的操作而移動,并且可以實現(xiàn)馬里奧游戲中的一些基本功能,例如踩死敵人或者頂?shù)舸u塊。本游戲采用雙緩存技術(shù),解決了游戲過程中的閃屏問題。通過本游戲的開發(fā),達(dá)到學(xué)習(xí)Java技術(shù)和熟悉軟件開發(fā)流程的目的。本文在介紹Java相關(guān)技術(shù)和國內(nèi)外發(fā)展現(xiàn)狀的基礎(chǔ)上,對“超級瑪麗”游戲的整個生命周期的各個開發(fā)階段進(jìn)行了詳細(xì)地介紹。為了保證程序代碼的正確性和功能實現(xiàn)的可靠性,本文還介紹了游戲軟件的程序調(diào)試過程和功能測試結(jié)果。

【關(guān)鍵字】:面向?qū)ο?;Java;碰撞檢測;超級瑪麗

Designandimplementationofjava-basedSuperMariogameAbstractInrecentyears,Javaasanewprogramminglanguage,withitssimplicity,portabilityandplatformindependence,etc.,havebeenwidelyused.J2SEcalledJavaStandardEditionorJavastandardplatforms.J2SESDKprovidesastandarddevelopmentplatform.YoucanusetheplatformtodevelopJavadesktopapplicationsandlow-endserverapplications,youcandevelopJavaAppletprogram."SuperMario"gameisaclassicgame,becauseitissimple,entertainingandpopular.ThegamefeaturesthroughthedevelopmentprocessandcodedesignsummaryandanalysisofJAVAgames,usingobject-orienteddesignpatterns,allobjectsofthegamegivestheconceptofobjectsandattributes.DevelopedaSuperMariogame,thegameisdividedintoseveralclassesformclass,classscene,Marioclass,classenemies,obstaclesandsoon.Inthemainthreadrunning,user-controlledSuperMariowiththearrowkeystomovetheoperation,andcanachieveMariogamesomebasicfunctions,suchassteppingontheenemyortopoffthebricks.Thegameusesdualcachingtechnologytosolvethegameduringthesplashscreenproblem.Throughthedevelopmentofthisgame,tolearnJavatechnologyandfamiliarwithsoftwaredevelopmentprocesspurposes.ThispaperdescribesthestateoftheartrelatedtothedevelopmentofJavaandabroadonthebasisofthevariousdevelopmentstagesof"SuperMario"gamefortheentirelifecycleofadetailedintroduction.Inordertoensurethecorrectnessoftheprogramcodeandfunctionstoachievereliability,thisarticledescribesthegamesoftwaredebuggingprocessandfunctionaltestresults.

Key

words:

Object-Oriented,java,CollisionDetection,Mario

目錄TOC\o"1-3"\h\u130771、緒論 11123131.1背景以及現(xiàn)狀 11214101.2

Java語言的特點

12163071.3

系統(tǒng)運行環(huán)境及開發(fā)軟件:

12174551.4

可行性的分析

13139851.4.1技術(shù)可行性 1345511.4.2

經(jīng)濟(jì)可行性

1346901.4.3

操作可行性

1477862、需求分析 14178962.1用戶需求分析 14197872.2功能需求分析 15230362.3界面設(shè)計需求分析 15138323、系統(tǒng)概要設(shè)計 1670313.1系統(tǒng)模塊設(shè)計 16160353.1.1窗體類 168703.1.2初始化類 1773783.1.3背景類 18185693.1.4馬里奧類 18259303.1.5障礙物類 19232313.1.6敵人類 19291323.2系統(tǒng)流程設(shè)計 20108664、系統(tǒng)詳細(xì)設(shè)計 2132344.1設(shè)計目標(biāo) 21148734.2系統(tǒng)模塊設(shè)計 2231544.2.1窗體類 22168294.2.2初始化類 26106024.2.3背景類 28302114.2.4馬里奧類 31294514.2.5障礙物類 37190554.2.6敵人類 39133095、系統(tǒng)的實現(xiàn) 42221675.1游戲開發(fā)所需要的圖片 4214485.1.1馬里奧的所有圖片 42219595.1.2游戲中障礙物的圖片 43101525.1.3游戲中怪物的圖片 4473565.1.4游戲中的背景圖片 44105065.1.5游戲開始時的圖片 4562705.2游戲設(shè)計的界面 4582005.2.1游戲邏輯展示 45320965.2.1游戲邏輯展示 4611946、系統(tǒng)測試 48109556.1測試的意義 48118036.2測試過程 4915376.3測試結(jié)果 49204837、總結(jié)與展望 50223527.1

總結(jié)

50169247.2

設(shè)計中的不足之處

51116627.3

展望

517649致

謝 5221087外文原文 533122外文翻譯 57

1、緒論1.1背景以及現(xiàn)狀隨著計算機(jī)日益普及,計算機(jī)已然成為人們?nèi)粘I畹囊徊糠值慕裉欤嬎銠C(jī)游戲也越來越成為人們生活中不可或缺的元素。游戲可以簡單地理解為調(diào)節(jié)人們生活節(jié)奏和緩解人們生活壓力的一種手段?,F(xiàn)在理解的游戲基本意義都是娛樂性質(zhì)較濃,要有特定的行為模式,遵循一定規(guī)則以達(dá)到游戲者目的的行動。游戲的最初目的就是讓游戲者(玩家)在游戲中得到放松。游戲一直存在于人類活動中,如今定義的游戲從早期的猜謎游戲,發(fā)展到如今的單機(jī)RPG游戲,網(wǎng)絡(luò)游戲等,已經(jīng)升華為更高級別意義上的娛樂活動,對人們的感官刺激也越發(fā)強烈,得到的樂趣也更多。Java并不是以游戲編程為目的而被開發(fā)的,事實上,游戲編程可能是Java創(chuàng)造者心中的最后一個目標(biāo)。在過去,妨礙Java發(fā)展的是它的運行環(huán)境;瀏覽器和Java類庫一起從本質(zhì)上決定了Java應(yīng)該用來寫哪種類型的應(yīng)用程序,而高速的游戲和圖象則不在其中。這給Java帶來了不好的影響,因為人們注意的不是語言,而是它的運行環(huán)境。現(xiàn)在,瀏覽器已經(jīng)不能控制一切了,Java作為游戲編程語言的另一個機(jī)會到來了。Java在過去有一點超前于它的時代,當(dāng)時市場的動力落后于Java,但是現(xiàn)在Java可以而且已經(jīng)取得成功。

1.2

Java語言的特點

1.

平臺無關(guān)性

Java引進(jìn)虛擬機(jī)原理,并運行于虛擬機(jī),實現(xiàn)不同平臺之間的Java接口。使用Java編寫的程序能在世界范圍內(nèi)共享。Java的數(shù)據(jù)類型與機(jī)器無關(guān)。2.

安全性

Java的編程類似C++,但舍棄了C++的指針對存儲器地址的直接操作,程序運行時,內(nèi)存由操作系統(tǒng)分配,這樣可以避免病毒通過指針入侵系統(tǒng)。它提供了安全管理器,防止程序的非法訪問。

3.

面向?qū)ο?/p>

Java吸收了C++面向?qū)ο蟮母拍?,將?shù)據(jù)封裝于類中,實現(xiàn)了程序的簡潔性和便于維護(hù)性,使程序代碼可以只需一次編譯就可反復(fù)利用。

4.

分布式

Java建立在TCP/IP網(wǎng)絡(luò)平臺上,提供了用HTTP和FTP協(xié)議傳送和接收信息的庫函數(shù),使用其相關(guān)技術(shù)可以十分方便的構(gòu)建分布式應(yīng)用系統(tǒng)。

5.

健壯性

Java致力與檢查程序在編譯和運行時的錯誤,并自動回收內(nèi)存,減少了內(nèi)存出錯的可能性。Java取消了C語言的結(jié)構(gòu)、指針、#define語句、多重繼承、goto語句、操作符、重載等不易被掌握的特性,提供垃圾收集器自動回收不用的內(nèi)存空間。1.3

系統(tǒng)運行環(huán)境及開發(fā)軟件:

開發(fā)環(huán)境:Windows

7;

(2)開發(fā)工具:eclipse;

(3)編程語言:Java語言;1.4

可行性的分析

可行性研究的目的,就是用最小的代價在盡可能短的時間內(nèi)確定問題是否能夠解決。要達(dá)到這個目的,必須分析幾種主要的可能解法的利弊,從而判斷原定的系統(tǒng)規(guī)模和目標(biāo)是否現(xiàn)實,系統(tǒng)完成后所能帶來的效益是否大到值得投資開發(fā)這個系統(tǒng)的程度。因此,可行性研究實質(zhì)上是要進(jìn)行一次大大壓縮簡化了的系統(tǒng)分析和設(shè)計的過程,也就是在較高層次上以較抽象的方式進(jìn)行的系統(tǒng)分析和設(shè)計的過程。1.4.1技術(shù)可行性本游戲是在Windows

7環(huán)境下開發(fā)的,一般的機(jī)器配置就可以了,對機(jī)器本身沒有太高的要求,一般當(dāng)前學(xué)?;騻€人電腦完全可滿足要求,環(huán)境只需裝上jdk

1.4或以上版本就行了,Java是現(xiàn)在全球最時髦的開發(fā)工具之一,它擁有一套龐大且完善的類庫,內(nèi)置了其他語言需要靠庫甚至是操作系統(tǒng)才能支持的功能,擁有一個虛擬機(jī)。NeatBeans

IDE

5.5是SUN公司開發(fā)的Java可視化集成開發(fā)工具,是目前最優(yōu)秀的Java集成開發(fā)工具之一。

1.4.2

經(jīng)濟(jì)可行性

由于本系統(tǒng)使用到的工具一般機(jī)器都具備,使用環(huán)境也很簡單,開發(fā)成本低,本課題研究的內(nèi)容是涉及網(wǎng)絡(luò)的游戲?qū)?zhàn)。當(dāng)今形式下網(wǎng)絡(luò)游戲儼然已經(jīng)成為年輕人最時興的消費方式之一,JAVA一直以來由于其可以“跨平臺”以及“一次編譯,到處運行”等特點,許多人直接它為網(wǎng)絡(luò)編程語言,且由于JAVA游戲一般來說簡單有趣,并且對用戶硬件要求極小,所以JAVA游戲通常對85%的計算機(jī)用戶都有吸引力。且政府態(tài)度和政策都是一種信號,表明2005年對本土網(wǎng)絡(luò)游戲的扶持力度將加大;國內(nèi)游戲廠商將可獲得發(fā)展的核心技術(shù)平臺;政策有利于保護(hù)中國游戲軟件的自主知識產(chǎn)權(quán);這為網(wǎng)絡(luò)游戲發(fā)展創(chuàng)造了良好的政策環(huán)境。

1.4.3

操作可行性

由于在整個系統(tǒng)的開發(fā)過程中從操作簡便、界面美觀、靈活實用的用戶要求為出發(fā)點,界面設(shè)計時充分考慮玩家的感受,界面比較直觀,交互性很好,所以操作起來簡單明了。

需求分析所謂系統(tǒng)分析,就是指在整個系統(tǒng)開發(fā)工程中,解決“做什么”的問題,把要解決哪些問題,滿足用戶哪些具體的信息需求調(diào)查分析清楚,從邏輯上或是說從信息處理的功能需求上提出系統(tǒng)的方案,即邏輯模型,為下一階段進(jìn)行物理方案設(shè)計,解決怎么辦提供依據(jù)。2.1用戶需求分析超級瑪麗這款游戲是很多人童年經(jīng)典的回憶,是一種簡單的大眾的游戲,自從計算機(jī)實現(xiàn)以來,深受廣大電腦玩家的喜愛。并且隨著社會的快速發(fā)展,人們的生活節(jié)奏越來越快,人們對于童年的美好已經(jīng)不愿意僅僅停留在回憶階段。所以利用java語言開發(fā)一款超級瑪麗游戲正是人們迫切需要的。2.2功能需求分析本系統(tǒng)主要是完成超級瑪麗游戲的基本操作。本系統(tǒng)需要滿足以下幾點要求:(1)在開始界面按空格鍵進(jìn)入游戲。(2)利用方向鍵來控制馬里奧的運動。(3)碰撞檢測:A.馬里奧在運動的過程中如果碰到障礙物則停止運動,在移動到懸崖上方是會掉下去,并失去一條生命。B.對于有些敵人,如果馬里奧跳到敵人頭頂上,則敵人消失,否則馬里奧失去一條生命。馬里奧頂?shù)浇饚艜黾臃謹(jǐn)?shù),當(dāng)馬里奧失去3條生命時游戲結(jié)束。2.3界面設(shè)計需求分析1)選取和諧Q版的圖片,使畫面色彩和諧自然。2)固定游戲界面大小與初始顯示位置。

3)游戲采用900*600像素顯示,對于馬里奧和障礙物選用60*60像素的正方圖片,對于較大的障礙物分割成多個60*60的小正方形。概要設(shè)計3.1系統(tǒng)模塊設(shè)計首先在對于系統(tǒng)的需求進(jìn)行了分析,因為設(shè)計者的最初是要做一款游戲,所以窗體類必不可少。接下來繼續(xù)分析,游戲中還需要背景類、障礙物類、敵人類、馬里奧類這及格類。其次為了游戲的流暢以及游戲中圖片調(diào)用的方便,專門為此再設(shè)計一個初始化類。3.1.1窗體類該類主要用于存放游戲的場景以及其他各類,并且實現(xiàn)KeyListener接口,用于從鍵盤的按鍵中讀取信息。該類中的一些屬性主要包括了用于存放所有場景的list集合allBG,馬里奧類mario,當(dāng)前的場景nowBG以及其他一些游戲中需要的標(biāo)記等。而且在該類中,運用雙緩存的技術(shù)使得游戲的流暢度更高,解決了游戲中出現(xiàn)的閃屏問題。Myframe-allBG:List-mario:Mario-nowBG:BackGround+main():void+paint():void+keyPressed():void+kerReleased():void3.1.2初始化類用于存放游戲所需要的所有靜態(tài)文件,在游戲開始的時候?qū)⑺形募?dǎo)入,提高游戲的運行速度。并且在該類中將所有需要用到的圖片進(jìn)行分類,分為障礙物類,馬里奧類,敵人類以及背景圖片。當(dāng)游戲運行時可以直接調(diào)用這些集合中的圖片進(jìn)行遍歷,在調(diào)用的時候更加方便,而且可以使馬里奧或者敵人在移動的時候產(chǎn)生動態(tài)效果。StaticValue+allMarioImage:List+startImage:BufferedImage+init():void3.1.3背景類該類表示馬里奧及障礙物和敵人所處的場景,并且將障礙物和敵人繪制到場景中。在該類中包括用于存放敵人和障礙物的list集合,以及當(dāng)敵人或者障礙物被消滅后用于存放已經(jīng)消失的敵人和障礙物的集合,這樣做是為了在馬里奧死亡時重置場景所用的。其次在該類中還使用了控制敵人移動的方法,是為了在程序之初控制敵人靜止,然后在玩家點擊空格以后在使得敵人開始移動。BackGround-bgImage:BufferedImage-isOver:boolean-isDown:boolean-allEnemy:List-removeEnemy:List+enemyStartMove():void+reset():void3.1.4馬里奧類用來控制馬里奧的行動,并且在該類中加入碰撞檢測,判斷馬里奧是否與障礙物或者敵人發(fā)生碰撞。該類中的屬性主要定義了馬里奧所在的場景,馬里奧的移動和跳躍的速度,以及馬里奧在移動過程中需要顯示的圖片。另外該類中還定義了玩家的生命值和所獲得的分?jǐn)?shù)。并且在run()方法中還定義了當(dāng)馬里奧到達(dá)最后一關(guān)的旗子時,玩家將失去對馬里奧的控制,剩下的由程序控制走到城堡,完整全部游戲。Mario-x:int-y:int-xmove:int-ymove;int-life:int-isDead:boolean+leftMove():void+leftStop():void+jump():void+down():void+dead():void3.1.5障礙物類繪制場景中所需要的障礙物,例如地面、磚塊、水管等等。該類中的屬性包括了障礙物的坐標(biāo),障礙物所需要顯示的圖片等。并且在該類中也定義了障礙物類的重置方法,當(dāng)馬里奧死亡時,場景類會調(diào)用該方法。Obstruction-x:int-y:int-type:int-starttype:int-showImage:BufferedImage+reset():void+setImage():void3.1.6敵人類該類中主要設(shè)置了兩種敵人,一種是蘑菇怪,可以被馬里奧踩死,另一種是食人花,不能被踩死。該類中的屬性包括了敵人的坐標(biāo),敵人的初始坐標(biāo),需要顯示的圖片,以及敵人的移動方向和移動范圍等。敵人的初始坐標(biāo)主要是為了當(dāng)敵人執(zhí)行重置方法后將敵人的位置還原。Enemy-x:int-y:int-startx:int-starty:int-showImage:BufferedImage-upMax:int-downMax:int+reset():void+dead():void

按空格鍵開始3.2系統(tǒng)流程設(shè)計按空格鍵開始使用方向鍵控制馬里奧移動使用方向鍵控制馬里奧移動判斷與場景中物體的碰撞判斷與場景中物體的碰撞敵人障礙物敵人障礙物是否丟失生命是否為磚塊是否丟失生命是否為磚塊否是是否否是是否阻止移動,磚塊消失阻止移動消滅敵人,繼續(xù)游戲阻止移動,磚塊消失阻止移動消滅敵人,繼續(xù)游戲是否已丟失三條生命是否是否游戲重置,并且失去一條生命游戲重置,并且失去一條生命游戲繼續(xù)并且繼續(xù)游戲直至通關(guān)繼續(xù)游戲直至通關(guān)游戲結(jié)束游戲結(jié)束系統(tǒng)詳細(xì)設(shè)計4.1設(shè)計目標(biāo)本軟件是針對超級瑪麗小游戲的JAVA程序,進(jìn)入游戲后首先按空格鍵開始,利用方向鍵來控制的馬里奧的移動,同時檢測馬里奧與場景中的障礙物和敵人的碰撞,并判斷馬里奧的可移動性和馬里奧的生命值。當(dāng)馬里奧通過最后一個場景后游戲結(jié)束。4.2系統(tǒng)模塊設(shè)計本系統(tǒng)共包括6各類:4.2.1窗體類該類主要用于存放游戲的場景以及其他各類,并且實現(xiàn)KeyListener接口,用于從鍵盤的按鍵中讀取信息。該類中的一些屬性主要包括了用于存放所有場景的list集合allBG,馬里奧類mario,當(dāng)前的場景nowBG以及其他一些游戲中需要的標(biāo)記等。而且在該類中,運用雙緩存的技術(shù)使得游戲的流暢度更高,解決了游戲中出現(xiàn)的閃屏問題。將該類的名字定義為MyFrame,并且要在該類中實現(xiàn)KeyListener接口和Runnable接口。然后首先要在該類中定義一個List集合,集合的泛型為背景類BackGround,集合的名字定義為allBG,用于存放所有的背景。接著定義一個Mario類屬性,名字為mario,這個就是游戲運行時候的所需要的mario。接下來還要在類中定義一個BackGround屬性,nowBG,默認(rèn)值應(yīng)當(dāng)為空,會在構(gòu)造方法中賦予該屬性初值,這個屬性主要是用來存放當(dāng)前游戲運行時馬里奧所處的游戲場景。另外該類中還應(yīng)該有一個Thread類屬性t,這個屬性主要是為了在游戲運行的時候控制游戲的線程。然后就可以在類中定義main()方法,將該類實現(xiàn)就可以了。值得一提的是該類的構(gòu)造方法相對來說是比較復(fù)雜的。 在該類的構(gòu)造方法中,應(yīng)當(dāng)首先繪制窗體類的標(biāo)題,以及窗體類的大小,并且要對窗體類在初始化的時候的位置,也就是在屏幕中顯示的位置,最好是顯示的時候居中,這樣的話在游戲運行時會比較美觀一些。其次還要對窗體的一個是否可拉升屬性進(jìn)行一下設(shè)置,這個設(shè)置的主要目的是因為游戲的界面都是開發(fā)者經(jīng)過深思熟慮考慮出來的比較美觀的界面,玩家隨意改變游戲的窗口大小可能會對游戲的體驗造成影響,所以在這里應(yīng)該設(shè)置游戲的窗體默認(rèn)不可以被拉伸。 publicMyFrame(){ this.setTitle("瑪麗奧"); this.setSize(900,600);//這里是為了獲得電腦屏幕的整體大小,以便于下面確定窗體的位置 intwidth=Toolkit.getDefaultToolkit().getScreenSize().width; intheight=Toolkit.getDefaultToolkit().getScreenSize().height; this.setLocation((width-900)/2,(height-600)/2);//設(shè)置窗體默認(rèn)不可以被拉伸 this.setResizable(false); //初始化圖片 StaticValue.init();當(dāng)這些都設(shè)置好以后,接下來就應(yīng)當(dāng)在構(gòu)造方法中繪制了,當(dāng)然最先應(yīng)當(dāng)將游戲的場景繪制到窗體類中,然后在窗體類中還應(yīng)當(dāng)繪制馬里奧類,這是游戲中必不可少的。當(dāng)然在繪制場景類的時候因為不知一個場景,所以可以使用循環(huán),將所有的場景全部繪制。然后在將所需要的所有監(jiān)視設(shè)置好以后就可以開啟該類的線程了。 //使用循環(huán)創(chuàng)建全部場景 for(inti=1;i<=7;i++){ this.allBG.add(newBackGround(i,i==7?true:false)); } //將第一個場景設(shè)置為當(dāng)前場景 this.nowBG=this.allBG.get(0); //初始化瑪麗奧 this.mario=newMario(0,480); //將瑪麗奧放入場景中 this.mario.setBg(nowBG); this.repaint(); this.addKeyListener(this); this.t=newThread(this); t.start();//使窗口在關(guān)閉的時候,程序也同時停止。 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); }在這些最基本的東西設(shè)置完以后,還需要一個方法來解決游戲中經(jīng)常會出現(xiàn)的閃屏問題。這個方法就是雙緩存方法,現(xiàn)在類中定義一個BufferedImage的圖片,然后從該圖片中獲取到圖片的Graphicsg2,然后利用畫筆g2將所要繪制的東西繪制到這個空的圖片中,然后在利用窗體類中的paint方法中的畫筆g將這個已經(jīng)繪制好的圖片繪制到窗體類中,這樣利用空白圖片作為程序運行中的中轉(zhuǎn),就可以很好的解決游戲運行過程中出現(xiàn)的閃屏問題。 publicvoidpaint(Graphicsg){ //先定義一個圖片,然后利用雙緩存解決閃屏問題 BufferedImageimage=newBufferedImage(900,600,BufferedImage.TYPE_3BYTE_BGR); Graphicsg2=image.getGraphics();//利用上面圖片中得到的畫筆g2,將所需繪制到圖片中 if(this.isStart){ //繪制背景 g2.drawImage(this.nowBG.getBgImage(),0,0,this); //繪制生命 g2.drawString("生命:"+this.mario.getLife(),800,50); //繪制怪物敵人 Iterator<Enemy>iterEnemy=this.nowBG.getAllEnemy().iterator(); while(iterEnemy.hasNext()){ Enemye=iterEnemy.next(); g2.drawImage(e.getShowImage(),e.getX(),e.getY(),this); } //把緩存圖片繪制進(jìn)去 g.drawImage(image,0,0,this); }當(dāng)然游戲的宗旨是讓玩家和電腦之間的互動,那么就又涉及到一個問題,就是玩家對游戲中的馬里奧的控制。我們前面已經(jīng)說過了該類中必須要實現(xiàn)KeyListener接口,這個接口的作用就是使該類中實現(xiàn)一些方法,以便于達(dá)到玩家在游戲進(jìn)行時可以對游戲中的馬里奧進(jìn)行控制。我們這里擬定對于馬里奧的控制可以使用我們常見的四個方向鍵,即我們說的上下左右。并且通過控制臺打印,可以知道上對應(yīng)的是38,右對應(yīng)的是39,左對應(yīng)的是37。并且游戲的設(shè)定是開始后游戲不會直接運行,而是要使用空格鍵以后游戲才會真正開始,所以還要加入當(dāng)按空格鍵的時候游戲正式開始,空格鍵對應(yīng)的是32。 publicvoidkeyPressed(KeyEvente){ if(this.isStart){ //瑪麗奧的移動控制 if(e.getKeyCode()==39){ this.mario.rightMove(); } if(e.getKeyCode()==37){ this.mario.leftMove(); } //跳躍控制 if(e.getKeyCode()==38){ this.mario.jump(); } }elseif(e.getKeyCode()==32){ this.isStart=true; } }對于按鍵,那么相對應(yīng)的就是當(dāng)抬起建的時候。因為你向右移動的時候,如果這時候突然停止,那么很可能馬里奧會保持一個運動的狀態(tài)停下來,那么就必須在瑪麗奧停止的時候給他一個指令,讓他的移動圖片變?yōu)殪o止。相對于運動的時候是類似的,這里不做累述。 publicvoidkeyReleased(KeyEvente){ if(this.isStart){ //控制瑪麗奧的停止 if(e.getKeyCode()==39){ this.mario.rightStop();; } if(e.getKeyCode()==37){ this.mario.leftStop();; } }當(dāng)這一切都做好以后,那么最后就應(yīng)該在類中重寫一下run方法了,在這個方法中應(yīng)當(dāng)提一下游戲的通關(guān)和死亡后的狀態(tài)。即游戲通關(guān),或者馬里奧死亡時應(yīng)當(dāng)彈出一個窗口,說明游戲通關(guān)或者馬里奧死亡,并且點擊了這個窗口以后,游戲應(yīng)當(dāng)結(jié)束,而且整個游戲也應(yīng)當(dāng)關(guān)閉。 if(this.mario.isDead()){ JOptionPane.showMessageDialog(this,"游戲結(jié)束"); System.exit(0); } if(this.mario.isClear()){ JOptionPane.showMessageDialog(this,"恭喜游戲通關(guān)!"); System.exit(0); }4.2.2初始化類用于存放游戲所需要的所有靜態(tài)文件,在游戲開始的時候?qū)⑺形募?dǎo)入,提高游戲的運行速度。并且在該類中將所有需要用到的圖片進(jìn)行分類,分為障礙物類,馬里奧類,敵人類以及背景圖片。當(dāng)游戲運行時可以直接調(diào)用這些集合中的圖片進(jìn)行遍歷,在調(diào)用的時候更加方便,而且可以使馬里奧或者敵人在移動的時候產(chǎn)生動態(tài)效果。首先在類中應(yīng)當(dāng)定義一個靜態(tài)的List,泛型為BufferedImage,屬性名字為allMarioImage,這個屬性的作用在于存放所有的馬里奧圖片,里面包括了馬里奧的移動圖片,站立圖片以及馬里奧跳躍的圖片。這樣在程序運行的時候就可以從該類中的這個屬性里面將所需要的馬里奧圖片直接調(diào)用出來,并且還可以在馬里奧移動時不斷遍歷里面的圖片,這樣就可以使馬里奧產(chǎn)生移動的動態(tài)效果。接下來要在該類中定義開始圖片,結(jié)束圖片以及背景圖片,默認(rèn)的初始值都為null。注意這些所有的屬性都是靜態(tài)的,包括下面要提到的所有的屬性,這樣做的目的是為了在程序運行時先加載這些圖片。然后應(yīng)當(dāng)定義存放食人花的List集合allFlowerImage,這個集合將食人花的不同形態(tài),張嘴、閉嘴圖片存放進(jìn)去,這樣在運行的時候進(jìn)行遍歷就可以打到動態(tài)效果。同理存放蘑菇怪的集合allTrangleImage,以及存放所有障礙物的集合allObstructionImage。publicclassStaticValue{ publicstaticList<BufferedImage>allMarioImage=newArrayList<BufferedImage>(); publicstaticBufferedImagestartImage=null; publicstaticBufferedImageendImage=null; publicstaticBufferedImagebgImage=null; publicstaticList<BufferedImage>allFlowerImage=newArrayList<BufferedImage>(); publicstaticList<BufferedImage>allTriangleImage=newArrayList<BufferedImage>(); publicstaticList<BufferedImage>allObstructionImage=newArrayList<BufferedImage>();定義完這些屬性之后,剩下的就是初始化了,在該類中定義一個init()方法,這個方法在執(zhí)行的時候會將所需的所有圖片放入到之前定義好的各個集合中。因為圖片存放的路徑都是一樣的,所以為了減少代碼量會定義一個公共路徑ImagePath。然后就可以利用循環(huán),將存放的圖片全部導(dǎo)入進(jìn)去。//介紹代碼量,定義公共路徑 publicstaticStringImagePath=System.getProperty("user.dir")+"/bin/"; //定義方法init(),將圖片初始化 publicstaticvoidinit(){ //利用循環(huán)將瑪麗奧圖片初始化 for(inti=1;i<=10;i++){ try{ allMarioImage.add(ImageIO.read(newFile(ImagePath+i+".png"))); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } //導(dǎo)入背景圖片 try{ startImage=ImageIO.read(newFile(ImagePath+"start.jpg")); bgImage=ImageIO.read(newFile(ImagePath+"firststage.jpg")); endImage=ImageIO.read(newFile(ImagePath+"firststageend.jpg")); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } //導(dǎo)入瑪麗奧死亡圖片 try{ mariDeadImage=ImageIO.read(newFile(ImagePath+"over.png")); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } }}4.2.3背景類該類表示馬里奧及障礙物和敵人所處的場景,并且將障礙物和敵人繪制到場景中。在該類中包括用于存放敵人和障礙物的list集合,以及當(dāng)敵人或者障礙物被消滅后用于存放已經(jīng)消失的敵人和障礙物的集合,這樣做是為了在馬里奧死亡時重置場景所用的。其次在該類中還使用了控制敵人移動的方法,是為了在程序之初控制敵人靜止,然后在玩家點擊空格以后在使得敵人開始移動。并且在第六個關(guān)卡處設(shè)置了一個隱形通關(guān)要點,只有當(dāng)馬里奧頂?shù)竭@個隱形磚塊時才會出現(xiàn),馬里奧就可以借助這個磚塊通過關(guān)卡。首先背景類中肯定要有一個標(biāo)記來表示現(xiàn)在是第幾個場景,因為不同的背景中所繪制的場景,障礙物等也不同,所以該類中要有一個int類型的場景順序sort。并且在游戲的設(shè)定中,如果玩家玩到最有一關(guān)的時候馬里奧會失去玩家的控制,自己走向城堡。那么這里就要這幾一個標(biāo)記,是否為最后的場景,類型為boolean類型。如果馬里奧失去所有生命值,或者游戲通關(guān)的話,那么游戲就會結(jié)束,這里還應(yīng)當(dāng)加一個boolean的標(biāo)記isOver判斷游戲是否結(jié)束。publicclassBackGround{ //當(dāng)前場景圖片 privateBufferedImagebgImage=null; //場景順序 privateintsort; //是否為最后的場景 privatebooleanflag; //游戲結(jié)束標(biāo)記 privatebooleanisOver=false;在最后一個關(guān)卡中,馬里奧到達(dá)旗桿的位置后就會失去控制,同時旗子將會開始下降,只有等旗子下降完畢后,馬里奧才能開始移動,所以這里還要定義一個旗子是否下降完畢的boolean類型的屬性isDown,用于判斷馬里奧什么時候移動。 //定義降旗結(jié)束 privatebooleanisDown=false;當(dāng)馬里奧失去生命的時候,但是并沒有失去所有的生命,那么這個時候應(yīng)當(dāng)重置這個場景,將所有消滅掉的障礙物和敵人全部還原。因此除了在該類中除了要定義存放敵人和障礙物的List集合以外,還應(yīng)當(dāng)有存放被消滅的敵人或者障礙物的List,當(dāng)敵人或者障礙物被消滅的時候先放入到這個List中,這樣在充值的時候就可以直接將這個集合中的數(shù)據(jù)在還原到原先的集合里面。 //用集合保存敵人 privateList<Enemy>allEnemy=newArrayList<Enemy>(); //用集合保存障礙物 privateList<Obstruction>allObstruction=newArrayList<Obstruction>(); //被消滅的敵人 privateList<Enemy>removeEnemy=newArrayList<Enemy>(); //被消滅的障礙物 privateList<Obstruction>removeObstruction=newArrayList<Obstruction>();在游戲的設(shè)定中,應(yīng)當(dāng)是游戲開始的時候,所有的敵人其實是靜止的,而且玩家也不能控制馬里奧,必須要等到玩家按空格鍵開始以后游戲才會進(jìn)行,那么這里就應(yīng)當(dāng)在定義一個方法,即當(dāng)玩家空格鍵的時候會調(diào)用這個方法,同時游戲中的敵人開始移動,游戲正式開始。這個方法也就是相當(dāng)于控制敵人開始移動的方法,所以命名為enemyStartMove()方法。 //敵人開始移動 publicvoidenemyStartMove(){//遍歷當(dāng)前場景中的敵人,使之開始移動 for(inti=0;i<this.allEnemy.size();i++){ this.allEnemy.get(i).startMove(); } }接下來就應(yīng)當(dāng)定義背景類的構(gòu)造方法了,通過獲取場景的順序,即場景的sort,來判斷是哪一個場景,同時將場景繪制好。 //構(gòu)造方法 publicBackGround(intsort,booleanflag){ //第一個場景 if(sort==1){ for(inti=0;i<15;i++){ this.allObstruction.add(newObstruction(i*60,540,9,this)); } //繪制磚塊和問號 this.allObstruction.add(newObstruction(120,360,4,this)); this.allObstruction.add(newObstruction(300,360,0,this)); }前面提到,如果馬里奧死亡,但是卻沒有失去所有的生命值,那么游戲應(yīng)當(dāng)重置,當(dāng)前場景中的所有敵人和障礙物,也包括馬里奧都應(yīng)當(dāng)回到初始位置。為了達(dá)到這個效果,那么我們的場景類中就必須要定義一個reset()方法,來調(diào)用障礙物和場景還有馬里奧的各自的重置方法,來使當(dāng)前的場景還原。并且在這之前我們還要將消滅掉的敵人和障礙物從消滅掉的存放的List中提出來,放回到原來的List中。然后遍歷障礙物和敵人的List,使用循環(huán)調(diào)用他們的重置方法。 //重置方法,重置障礙物和敵人 publicvoidreset(){ //將移除的障礙物和敵人還原 this.allEnemy.addAll(this.removeEnemy); this.allObstruction.addAll(this.removeObstruction); //調(diào)用障礙物和敵人的重置方法 for(inti=0;i<this.allEnemy.size();i++){ this.allEnemy.get(i).reset(); } for(inti=0;i<this.allObstruction.size();i++){ this.allObstruction.get(i).reset(); } } 4.2.4馬里奧類用來控制馬里奧的行動,并且在該類中加入碰撞檢測,判斷馬里奧是否與障礙物或者敵人發(fā)生碰撞。該類中的屬性主要定義了馬里奧所在的場景,馬里奧的移動和跳躍的速度,以及馬里奧在移動過程中需要顯示的圖片。另外該類中還定義了玩家的生命值和所獲得的分?jǐn)?shù)。并且在run()方法中還定義了當(dāng)馬里奧到達(dá)最后一關(guān)的旗子時,玩家將失去對馬里奧的控制,剩下的由程序控制走到城堡,完整全部游戲。在游戲中,瑪麗奧要在玩家的控制下完成移動、跳躍等動作,那么這些動作首先肯定要涉及到坐標(biāo),那么我們在該類中首先要定義兩個屬性,這兩個屬性即為馬里奧的坐標(biāo)x和y。并且該類還要實現(xiàn)Runnable接口,在run()方法中寫馬里奧的移動規(guī)則。publicclassMarioimplementsRunnable{ //坐標(biāo) privateintx; privateinty; //定義瑪麗奧所在場景 privateBackGroundbg; //加入線程 privateThreadt=null;為了玩家在游戲過程中的良好體驗,那么對于馬里奧的移動速度和跳躍速度就必須要定義好。所以該類里面還應(yīng)當(dāng)定義馬里奧的移動速度和跳躍速度,其本質(zhì)就是馬里奧在移動過程中坐標(biāo)加減的值。當(dāng)然初始值為零,必須等到馬里奧構(gòu)造的時候,再將這些屬性賦予相對應(yīng)的值。在本類中還要定義游戲的分?jǐn)?shù)以及馬里奧的生命數(shù),這些都是必不可少的。 //移動速度 privateintxmove=0; //跳躍速度 privateintymove=0; //狀態(tài) privateStringstatus; //顯示圖片 privateBufferedImageshowImage; //生命和分?jǐn)?shù) privateintscore; privateintlife;在馬里奧這個類中,還要定義馬里奧的移動和跳躍方法,以便玩家在按下方向鍵后調(diào)用這些方法,來達(dá)到控制馬里奧的移動。下面是馬里奧向左移動的方法,其他方法同理。 publicvoidleftMove(){ //移動速度 xmove=-5; //改變狀態(tài) //如果當(dāng)前已經(jīng)是跳躍,應(yīng)該保持原有狀態(tài),不能再改變 if(this.status.indexOf("jumping")!=-1){ this.status="left-jumping"; }else{ this.status="left-moving"; } }在定義馬里奧的跳躍方法的時候,不單單定義一個方法就行,而且還要判斷馬里奧的狀態(tài)。如果馬里奧是在地面或者是在障礙物的上方,那么馬里奧可以進(jìn)行跳躍,如果馬里奧處于空中,那么馬里奧就不可以繼續(xù)跳躍。 publicvoidjump(){//判斷馬里奧是否可以進(jìn)行跳躍 if(this.status.indexOf("jumping")==-1){ if(this.status.indexOf("left")!=-1){ this.status="left-jumping"; }else{ this.status="right-jumping"; } ymove=-5; upTime=36; } }接下來就要寫馬里奧中的run()方法了,這個方法中的內(nèi)容相對來說比較麻煩,因為要在這個方法中對馬里奧和障礙物或者敵人之間進(jìn)行邏輯判斷,即所謂的碰撞檢測。首先在這個類中對馬里奧是否處于最后一個場景進(jìn)行判斷,如果馬里奧處于最后一個場景,并且坐標(biāo)大于520,那么說明馬里奧已經(jīng)撞到的旗桿,這個時候馬里奧將不會由玩家控制。并且同時調(diào)用旗子的移動方法,使旗子進(jìn)行下落,當(dāng)旗子下落完畢后給馬里奧一個標(biāo)記,馬里奧開始移動到城堡。當(dāng)馬里奧的坐標(biāo)大于780,即馬里奧到達(dá)城堡的門口的時候,這個時候游戲結(jié)束。 publicvoidrun(){ while(true){ //判斷是否與障礙物碰撞 //定義標(biāo)記 if(this.bg.isFlag()&&this.x>=520){ this.bg.setOver(true); if(this.bg.isDown()){ //降旗后瑪麗奧開始移 this.status="right-moving"; if(this.x<580){ //向右 this.x+=5; } if(this.x>=780){ //游戲結(jié)束 this.setClear(true); }然后對當(dāng)前馬里奧所處的場景中的所有障礙物進(jìn)行遍歷,獲取到所有障礙物的坐標(biāo),通過障礙物的坐標(biāo)和馬里奧的坐標(biāo)的之間的關(guān)系的判斷,來決定馬里奧是否與障礙物發(fā)生了碰撞,并且通過判斷的結(jié)果來對馬里奧和障礙物的狀態(tài)進(jìn)行相應(yīng)的變化。 for(inti=0;i<this.bg.getAllObstruction().size();i++){ Obstructionob=this.bg.getAllObstruction().get(i); //不能向右移動 if(ob.getX()==this.x+60&&(ob.getY()+50>this.y&&ob.getY()-50<this.y)){ if(ob.getType()!=3){ canRight=false; } } 當(dāng)馬里奧撞到障礙物的時候,那么就要根據(jù)障礙物的類型進(jìn)行接下來的判斷,如果是磚塊或者是問號的話,那么障礙物消失,馬里奧被彈回,即馬里奧的狀態(tài)由上升狀態(tài)變?yōu)橄侣錉顟B(tài),并且將消失掉的障礙物放入相對應(yīng)的消失的List集合當(dāng)中。如果障礙物的類型為其他,比如說是石頭的話,那么障礙物不變,馬里奧直接被彈回。 //判斷瑪麗奧跳躍時是否撞到障礙物 if(ob.getY()==this.y-60&&(ob.getX()+50>this.x&&ob.getX()-50<this.x)){ //如果是磚塊 if(ob.getType()==0){ //移除磚塊 this.bg.getAllObstruction().remove(ob); //保存到移除的障礙物中 this.bg.getRemoveObstruction().add(ob); }為了游戲的可玩性,將會在游戲中加入一個隱藏的陷阱,或者是隱藏的通關(guān)點。這個隱藏的障礙物在游戲進(jìn)行的時候不會顯示出來,當(dāng)然馬里奧從他的左右兩邊過去的時候也不會觸發(fā)這個隱藏的障礙物,必須是從下方撞到這個障礙物時才會顯示出來。同時馬里奧由上升狀態(tài)變?yōu)橄侣錉顟B(tài)。而且他和磚塊障礙物相同,被頂?shù)胶髸優(yōu)槭^,改變類型。 //如果是問號||隱藏的磚塊 if((ob.getType()==4||ob.getType()==3)&&upTime>0){ ob.setType(2); ob.setImage(); }//馬里奧開始下落 upTime=0;在游戲中敵人大致可以分為兩類。一類是蘑菇怪,這種敵人是可以被殺死的,當(dāng)馬里奧從蘑菇怪的正上方踩到蘑菇怪時,那么蘑菇怪就會被消滅,同時馬里奧向上跳起一小段距離。而消失掉的蘑菇怪就會被放到消失掉的敵人的List集合中,等到重置的時候在調(diào)用出來。但是如果馬里奧從蘑菇怪的左右兩邊碰到蘑菇怪的話就會失去一條生命,并且重置游戲。第二類是食人花,這種敵人不會被馬里奧消滅掉,不論馬里奧從哪個方向去碰撞食人花,食人花都不會消失,而且如果馬里奧碰到了食人花,自身還會失去一條生命,并且游戲重置,當(dāng)然前提是馬里奧沒有失去所有的生命值,否則的話游戲就結(jié)束。首先馬里奧對于所有的敵人,如果從左右兩邊碰撞到敵人,那么馬里奧死亡,失去一條生命,游戲重置。 //對敵人的判斷 for(inti=0;i<this.bg.getAllEnemy().size();i++){ Enemye=this.bg.getAllEnemy().get(i);//對于所有的敵人都適用 if((e.getX()+50>this.x&&e.getX()-50<this.x)&&(e.getY()+60>this.y&&e.getY()-60<this.y)){ //瑪麗奧死亡 this.dead(); }//這里開始區(qū)分?jǐn)橙说念悇e,對于不同的敵人做出不同的反應(yīng) if(e.getY()==this.y+60&&(e.getX()+60>this.x&&e.getX()-60<this.x)){ if(e.getType()==1){ e.dead(); this.upTime=10; this.ymove=-5; }elseif(e.getType()==2){ this.dead(); } } 4.2.5障礙物類繪制場景中所需要的障礙物,例如地面、磚塊、水管等等。該類中的屬性包括了障礙物的坐標(biāo),障礙物所需要顯示的圖片等。并且在該類中也定義了障礙物類的重置方法,當(dāng)馬里奧死亡時,場景類會調(diào)用該方法。游戲中的場景是由背景中的障礙物繪制而成的,不同的障礙物所在的位置肯定也不相同,那么對于障礙物而言,就必須要有坐標(biāo)屬性來使繪制的時候?qū)⒉煌恼系K物繪制到不同的位置,所以必須要有兩個int屬性x和y來表示障礙物的坐標(biāo)。同時該類也必須要實現(xiàn)Runnable接口,實現(xiàn)這個接口的作用主要是為了在最有一個場景中控制旗子的運動,當(dāng)然同時還要為該類加入線程。publicclassObstructionimplementsRunnable{ //坐標(biāo) privateintx; privateinty; //控制旗子 privateThreadt=newThread(this);前面說過,當(dāng)馬里奧頂?shù)絾柡没蛘呤请[藏的磚塊時,那么這個障礙物的類型就會改變,變?yōu)槭^。那么在障礙物這個類里面就必須要定義一個屬性stype,這個屬性用于表示當(dāng)前障礙物的類型,以便于變化形態(tài)的時候調(diào)用。這個類型的值就可以用初始化類中的相對應(yīng)的List集合里面的下標(biāo)表示。既然有改變,就要有恢復(fù),所以還要定義一個不變的type,命名為starttype,這個屬性是為了當(dāng)游戲重置的時候,障礙物可以通過調(diào)用這個屬性恢復(fù)到最初始的狀態(tài)。而且不同的狀態(tài)對應(yīng)不同的顯示圖片,所以還要有showImage屬性。 //類型 privateinttype; //初始類型 privateintstarttype; //顯示圖片 privateBufferedImageshowImage=null; //取得場景 privateBackGroundbg;在該類中還要寫入reset()方法,這個方法是為了當(dāng)馬里奧死的時候調(diào)用重置方法,對已經(jīng)被消滅掉的障礙物進(jìn)行重置。因為有的障礙物被頂?shù)粢院髸o變類型和圖片,所有還要定義一個setImage()方法,用來改變障礙物的顯示圖片。 //重置方法 publicvoidreset(){ this.type=starttype; this.setImage(); } //根據(jù)狀態(tài)改變顯示圖片 publicvoidsetImage(){ showImage=StaticValue.allObstructionImage.get(type); }最后該類中的run方法主要是為了控制最后一個場景中的旗子的移動,并且在旗子移動完畢后要設(shè)置一個標(biāo)記,并且將該標(biāo)記表示給馬里奧類,這樣馬里奧就可以開始自主移動了。 if(this.bg.isOver()){ if(this.y<420){ this.y+=5; }else{//設(shè)計標(biāo)記為true,即表示馬里奧可以開始移動了 this.bg.setDown(true); }4.2.6敵人類該類中主要設(shè)置了兩種敵人,一種是蘑菇怪,可以被馬里奧踩死,另一種是食人花,不能被踩死。該類中的屬性包括了敵人的坐標(biāo),敵人的初始坐標(biāo),需要顯示的圖片,以及敵人的移動方向和移動范圍等。敵人的初始坐標(biāo)主要是為了當(dāng)敵人執(zhí)行重置方法后將敵人的位置還原。在該類中首先要實現(xiàn)Runnable接口,因為在游戲中的敵人是可以移動的,所以一定要通過重寫run()方法來達(dá)到敵人可以移動的效果。當(dāng)然還要在該類中定義一個Thread屬性,用于控制線程。然后說說到移動,必然少不了坐標(biāo)問題,那么在該類中就要定義兩個int屬性x和y,用于控制敵人的位置以及敵人的移動。publicclassEnemyimplementsRunnable{ //坐標(biāo) privateintx; privateinty;//加入線程 privateThreadt=null;當(dāng)馬里奧失去一條生命值的時候,游戲會被重置,敵人回回到初始的位置,所以還要定義另外兩個int屬性startx和starty,用來當(dāng)游戲進(jìn)行重置的時候,可以根據(jù)這個初始坐標(biāo)回復(fù)敵人的位置。 //初始坐標(biāo) privateintstartx; privateintstarty;對于不同的敵人,所顯示的圖片肯定是不同的,所以要定義一個現(xiàn)實的圖片屬性showImage,并且在馬里奧中,馬里奧要通過判斷敵人的類型,來決定是馬里奧死亡,還是敵人死亡,對于不同的敵人有不同的反應(yīng),所以還要在該類中定義一個type屬性,用來表示敵人的類型。 //怪物類型 privateinttype; //顯示圖片 privateBufferedImageshowImage;對于敵人里面的食人花而言,他是在水管中直上直下的,所以他的上下移動應(yīng)當(dāng)有一個界限,不論是向上移動還是向下移動,都不能超過這個界限,否則的話食人花就會從水管中飛出來或者是移動到MyFrame外面了。 //移動范圍 privateintupMax=0; privateintdownMax=0;在這個類中應(yīng)當(dāng)有兩個構(gòu)造方法,對于不同的敵人,所需要的屬性都是不同的。并且在兩個類中都有一個共同的代碼,那就是要在開啟線程后應(yīng)當(dāng)先將線程掛起。這是為了配合游戲在開始的時候敵人不移動,必須要等到玩家按空格鍵的時候才會開始,所以先將線程掛起來,當(dāng)點擊空格鍵以后在將線程開啟。 //蘑菇怪的構(gòu)造方法 publicEnemy(intx,inty,booleanisLeft,inttype,BackGroundbg){ ...... this.t=newThread(this); t.start(); t.suspend(); }接下來是寫敵人類中的run()方法了,該方法主要是為了控制蘑菇怪以及食人花敵人的移動的。因為不同的敵人在不同的場景中有不同的移動方法,所以對于敵人的移動而且,首先要判斷敵人的類型和敵人所處的場景。 publicvoidrun(){ while(true){ //判斷怪物類型 if(type==1){ if(this.isLeftOrUp){ this.x-=5; }else{ this.x+=5; } ......在游戲中,當(dāng)馬里奧死亡的時候會對整個場景中的障礙物進(jìn)行重置,當(dāng)然敵人也不例外。當(dāng)馬里奧死亡的時候,不僅要將所有被消滅的敵人全部顯示出來,即從消滅的List中還原到原來的敵人List中,并且敵人的狀態(tài)和坐標(biāo)也要進(jìn)行重置。要將敵人的坐標(biāo)還原到最開始的坐標(biāo),而且把圖片進(jìn)行還原。并且在重置方法中也要對敵人的類型進(jìn)行判斷,使得敵人的類型和他的顯示圖片相對應(yīng)。 publicvoidreset(){ //還原坐標(biāo) this.x=this.startx; this.y=this.starty; //還原圖片 if(this.type==1){ this.showImage=StaticValue.allTriangleImage.get(0); }elseif(this.type==2){ this.showImage=StaticValue.allFlowerImage.get(0); } }最后在該類中定義一個死亡方法,主要是針對蘑菇怪被消滅的時候所調(diào)用的方法。在這個方法中要定義蘑菇怪死亡的時候的顯示圖片,也就是蘑菇怪被踩扁的圖片。并且要將這個敵人從相對應(yīng)的場景的敵人集合中除去,放入別消滅的敵人的List集合。 publicvoiddead(){ //死亡圖片 this.showImage=StaticValue.allTriangleImage.get(2); //從原來的List集合中刪除,讓入被消滅的List集合中 this.bg.getAllEnemy().remove(this); this.bg.getRemoveEnemy().add(this); } }5、系統(tǒng)的實現(xiàn)5.1游戲開發(fā)所需要的圖片5.1.1馬里奧的所有圖片這組圖片中包含了馬里奧的移動,跳躍以及死亡的圖片:A.馬里奧向左移動的圖片B.馬里奧向左跳躍的圖片C.馬里奧向右移動的圖片D.馬里奧向右跳躍的圖片E.馬里奧死亡的圖片5.1.2游戲中障礙物的圖片這組圖片中包含了游戲中的各種障礙物,以及最后通過關(guān)卡的旗幟圖片還有設(shè)置陷阱的隱形圖片:地面及普通障礙物圖片B.用于設(shè)置陷阱的隱形圖片C.水管類圖片D.最后場景中的旗幟圖片5.1.3游戲中怪物的圖片這組圖片中包含了游戲中所有的敵人圖片,以及敵人被消滅時的圖片:A.食人花的圖片B蘑菇怪的圖片以及被消滅時的圖片.C.烏龜?shù)膱D片以及被消滅時的圖片5.1.4游戲中的背景圖片這組圖片中有一張游戲中的背景圖片(圖5.1)和一張馬里奧通關(guān)時的最后一關(guān)的背景圖片(圖5.2):圖5.1圖游戲開始時的圖片在游戲的最開始會顯示該圖片(圖5.3),然后玩家按空格鍵開始游戲,之后游戲才正式開始運行。圖5.35.2游戲設(shè)計的界面5.2.1游戲邏輯展示這一組圖片中包括了一些系統(tǒng)中的邏輯圖片,如馬里奧的控制移動示例圖片(圖5.4),玩家通過方向鍵控制馬里奧的移動、跳躍等功能;馬里奧與障礙物進(jìn)行碰撞之后的效果圖片(圖5.5),這張圖片中顯示了馬里奧再與障礙物碰撞后,問號會消失變成石頭,而且磚塊會被撞碎;玩家控制游戲開始的圖片(圖5.6),游戲打開后并不會立即運行,必須等到玩家按空格鍵啟動游戲后游戲才會正式開始;當(dāng)馬里奧失去所有的生命以后,游戲結(jié)束(圖5.7);如果馬里奧順利通過所有關(guān)卡,那么游戲同樣結(jié)束(圖5.8)。圖5.4圖5.5圖5.6圖5.7圖游戲邏輯展示這一組圖片中主要對游戲的關(guān)卡進(jìn)行展示,其中包括第一關(guān)(圖5.9),馬里奧順利通過第一管來到第二關(guān)(圖5.10),第三關(guān)的場景(圖5.11),第四關(guān)的大懸崖場景(圖5.12),第五關(guān)的場景借鑒了魂斗羅(圖5.13),第六關(guān)的高墻(圖5.14),在這一個關(guān)卡中為了提升游戲的可玩性,加了一個隱藏的過關(guān)要點,只有找到這個要點才能通過(圖5.15),第七關(guān)也是最后一關(guān)的場景(圖5.16)。圖5.9圖5.10圖5.11圖5.12圖5.13圖5.14圖5.15圖5.166、系統(tǒng)測試6.1測試的意義系統(tǒng)測試是為了發(fā)現(xiàn)錯誤而執(zhí)行程序的過程,成功的測試是發(fā)現(xiàn)了至今尚未發(fā)現(xiàn)的錯誤的測試。測試的目的就是希望能以最少的人力和時間發(fā)現(xiàn)潛在的各種錯誤和缺陷。應(yīng)根據(jù)開發(fā)各階段的需求、設(shè)計等文檔或程序的內(nèi)部結(jié)構(gòu)精心設(shè)計測試用例,并利用這些實例來運行程序,以便發(fā)現(xiàn)錯誤。系統(tǒng)測試是保證系統(tǒng)質(zhì)量和可靠性的關(guān)鍵步驟,是對系統(tǒng)開發(fā)過程中的系統(tǒng)分析系統(tǒng)設(shè)計和實施的最后復(fù)查。根據(jù)測試的概念和目的,在進(jìn)行信息系統(tǒng)測試時應(yīng)遵循以基本原則。6.2測試過程(1)擬定測試計劃。在制定測試計劃時,要充分考慮整個項目的開發(fā)時間和開發(fā)進(jìn)童以及一些人為因素和客觀條件等,使得測試計劃是可行的。測試計劃的內(nèi)容主要有測試的內(nèi)容、進(jìn)度安排、測試所需的環(huán)境和條件、測試培訓(xùn)安排等。(2)編制測試大綱。測試大綱是測試的依據(jù)。它明確詳盡地規(guī)定了在測試中針對系統(tǒng)的每一項功能或特性所必須完成的基本測試項目和測試完成的標(biāo)準(zhǔn)。(3)根據(jù)測試大綱設(shè)計和生成測試用例。在設(shè)計測試用例的時候,可綜合利用前面介紹的測試用例和設(shè)計技術(shù),產(chǎn)生測試設(shè)計說明文檔,其內(nèi)容主要有被測項目、輸人數(shù)據(jù)、測試過程、預(yù)期輸出結(jié)果等。(4)實施測試。測試的實施階段是由一系列的測試周期組成的。在每個測試周期中,測試人員和開發(fā)人員將依據(jù)預(yù)先編制好的測試大綱和準(zhǔn)備好的測試用例,對被測軟件或設(shè)備進(jìn)行完整的測試。(5)生成測試報告。測試完成后,要形成相應(yīng)的測試報告,主要對測試進(jìn)行概要說明,列出測試的結(jié)論,指出缺陷和錯誤,另外,給出一些建議,如可采用的修改方法,各項修改預(yù)計的工作量及修改的負(fù)責(zé)人員。6.3測試結(jié)果程序運行正常,沒有發(fā)現(xiàn)什么太大的錯誤。7、總結(jié)與展望7.1

總結(jié)

本次設(shè)計已是大學(xué)最后一次對專業(yè)知識的綜合實踐活動,同時也是我所做的工作量最大的一次作業(yè),因此從一開始我對本次畢業(yè)設(shè)計就給予了高度重視。從選題、收集資料、學(xué)習(xí)相關(guān)技術(shù)到實際編程,我都一絲不茍的對待了。當(dāng)然其間我也走了不少彎路,有時甚至需要推倒重來,但同時我也多次體會過克服困難后的成就感。

通過這次畢業(yè)設(shè)計以及撰寫本畢業(yè)論文,我學(xué)會了一些編程技巧,而且對調(diào)試的錯誤有進(jìn)一步的認(rèn)識,有時候就一個小小的語法錯誤就會導(dǎo)致程序調(diào)試不通過。所以每個字符,每句程序都要認(rèn)真對待。使用不同的編程環(huán)境,其效率完全不一樣,所以我選擇了Eclipse,它自動找錯/糾錯功能、Debug調(diào)試和代碼自動生成等一些重要的功能大大提高了我的設(shè)計效率。

7.2

設(shè)計中的不足之處

本系統(tǒng)實現(xiàn)了超級瑪麗游戲所應(yīng)有的基本功能,我對這樣的軟件開發(fā)還只是一個開始,了解的不多,時間和能力有限,還有一部分功能未能實現(xiàn),如吃到蘑菇會變大,或者吃到花朵可以發(fā)子彈,還有就是一些其他的怪物類。因此做的不是很好,游戲的場景設(shè)計和布局還比較簡單,有些模塊和功能的設(shè)計不是那么的完善,沒有突出特色出來,這也可能是我這個程序的不足之處。

7.3

展望

本系統(tǒng)基本實現(xiàn)了超級瑪麗游戲所應(yīng)有的基本功能,在大學(xué)中最后一次專攻式的學(xué)習(xí)了Java語言,使我對Java語言有了更深層次的理解,通過該游戲設(shè)計,提高了我的編程能力,也讓我養(yǎng)成了良好的編程習(xí)慣。這個次的畢業(yè)設(shè)計當(dāng)然也使自己深深的認(rèn)識到了java這門語言的博大精深,希望將來在工作中能夠不斷學(xué)習(xí),不斷進(jìn)步,逐步的通過自己的積累去慢慢的學(xué)習(xí),慢慢的融匯這門語言,爭取早日成為能獨當(dāng)一面的java技術(shù)開發(fā)人才。致

謝經(jīng)過一兩個月的忙碌和工作,本次畢業(yè)設(shè)計業(yè)已完成了,作為一個本科生的畢業(yè)設(shè)計,由于經(jīng)驗的匱乏和業(yè)務(wù)邏輯的不熟悉,難免有許多考慮不周全和不完善的地方,但是在指導(dǎo)老師.任課老師和同學(xué)的幫助下很多困難都得以解決,所以在此本人要特別感謝他們對我的幫助。

首先我要感謝我的學(xué)校指導(dǎo)老師,感謝他們在整個畢業(yè)設(shè)計過程中的指導(dǎo),為我提示游戲設(shè)計的邏輯思路;為我提供參考書籍;為我提供了技術(shù)方面資料,而且在遇到問題的時候,總是鼓勵我去解決;尤其在論文格式的修改方面,讓我明白了要寫出一個標(biāo)準(zhǔn)的論文,它的格式的重要性,哪怕就算是一個標(biāo)點符號都要符合其標(biāo)準(zhǔn)和格式要求。在設(shè)計的整個過程中從最初的畢業(yè)設(shè)計題目的選定,以及中期檢查,以及定稿的過程中都給予了我細(xì)心的指導(dǎo)。

其次還要特別感謝大學(xué)四年來所有的老師,為我們打下計算機(jī)專業(yè)知識的基礎(chǔ)。以前總是覺得學(xué)的課程沒有什么用處,但是當(dāng)真正用計算機(jī)來解決實際問題的時候,才知道每門課程的重要性,甚至覺得所學(xué)習(xí)的那些課程還遠(yuǎn)遠(yuǎn)不夠,所以以后還應(yīng)該不斷的學(xué)習(xí)。也可以這么說要不是你們在大學(xué)四年中嚴(yán)格要求我們,現(xiàn)在要

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論