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

下載本文檔

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

文檔簡(jiǎn)介

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

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

【關(guān)鍵字】:面向?qū)ο螅籎ava;碰撞檢測(cè);超級(jí)瑪麗

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語言的特點(diǎn)

12163071.3

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

總結(jié)

50169247.2

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

51116627.3

展望

517649致

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

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

1.2

Java語言的特點(diǎn)

1.

平臺(tái)無關(guān)性

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

安全性

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

3.

面向?qū)ο?/p>

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

4.

分布式

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

5.

健壯性

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

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

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

7;

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

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

可行性的分析

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

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

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

IDE

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

1.4.2

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

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

1.4.3

操作可行性

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

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

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

總結(jié)

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

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

7.2

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

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

7.3

展望

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

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

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

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論