已閱讀5頁,還剩37頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
河北農(nóng)業(yè)大學(xué) 本科畢業(yè)論文(設(shè)計(jì))題 目: 超級瑪麗小游戲設(shè)計(jì) 學(xué) 院: 信息科學(xué)與技術(shù)學(xué)院 專業(yè)班級: 計(jì)算機(jī)1002班 學(xué) 號: 二O一四 年 六 月 一 日摘要超級瑪麗全名超級馬里奧兄弟,是任天堂公司出品的著名橫版過關(guān)游戲,最早在紅白機(jī)上推出,有多款后續(xù)作品,迄今多個版本合共銷量已突破4000萬套。其中的主角馬里奧、路易、桃子公主、蘑菇王子等等已成為任天堂的招牌人物。該課題主要是模仿經(jīng)典的超級瑪麗完成相應(yīng)的游戲功能。本游戲以java為主要技術(shù)核心,通過各種核心類實(shí)現(xiàn)了游戲中的主要人物和角色,并通過各類函數(shù)實(shí)現(xiàn)了地圖的繪制、碰撞檢測、鍵控、滾屏等核心功能,并對游戲進(jìn)行了一系列優(yōu)化,例如產(chǎn)生新對象,收集垃圾,對時間、空間的權(quán)衡,實(shí)現(xiàn)了電腦版的超級瑪麗。關(guān)鍵字: 超級瑪麗;Java;碰撞檢測;滾屏AbstractSuper Marie full name super Mario Bros. version of the cross, is a famous Nintendo Co produced the pass of the game, the first introduced in red and white machine, there are a variety of subsequent works, so multiple versions of total sales have exceeded 40000000 sets. One of the main characters Mario, Louis, Princess Peach, mushroom Prince has become Nintendo sign characters. The main issue is to imitate the classic super Marie to complete the corresponding game function. This game is the main core technology in Java, through a variety of core class implements the main characters and the characters in the game, and implements map rendering, collision detection, key control, scrolling and other core functions through various kinds of function, and the Games were a series of optimization, such as creating a new object, garbage collection, to balance time, space, achieve 1 computer version of super Marie.Key words: Super Marie ,Java, Collision detection ,Roller screen目錄1.緒論11.1java介紹11.2超級瑪麗游戲的歷史12.基本概要22.1游戲應(yīng)用環(huán)境的構(gòu)建22.1.1游戲需要的硬件環(huán)境22.1.2游戲需要的軟件環(huán)境22.2操作22.3游戲界面23.系統(tǒng)分析43.1本程序需要解決的主要技術(shù)問題43.2游戲的總體構(gòu)架43.3程序的類結(jié)構(gòu)以及流程圖53.3.1 類結(jié)構(gòu)53.3.2 流程圖64.詳細(xì)設(shè)計(jì)及實(shí)現(xiàn)74.1地圖的實(shí)現(xiàn)74.1.1地圖的結(jié)構(gòu)74.1.2約定規(guī)則74.1.3地圖的產(chǎn)生84.2滾屏的實(shí)現(xiàn)94.2.1原理94.2.2地圖內(nèi)部對象的移動94.2.3小結(jié)94.3地圖切換的實(shí)現(xiàn)94.4碰撞檢測104.4.1原理104.4.2碰撞檢測在游戲中的應(yīng)用104.5瑪麗以及鍵控處理的實(shí)現(xiàn)104.5.1 Mario類的實(shí)現(xiàn)114.5.2鍵控處理124.6磚頭的實(shí)現(xiàn)124.6.1分類124.6.2結(jié)構(gòu)134.7敵人的實(shí)現(xiàn)134.7.1分類134.7.2結(jié)構(gòu)144.8重力模擬155.游戲的優(yōu)化及注意點(diǎn)165.1游戲中屏幕繪制技術(shù)的優(yōu)化165.2游戲中新對象的產(chǎn)生和垃圾收集165.3游戲?qū)ο到y(tǒng)資源占用的優(yōu)化176.總結(jié)18參考文獻(xiàn)20致謝21附錄221. 緒論1.1 java介紹Java是一種可以撰寫跨平臺應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,是由Sun Microsystems公司于1995年5月推出的Java程序設(shè)計(jì)語言和Java平臺(即JavaEE, JavaME, JavaSE)的總稱。Java自面世后就非常流行,發(fā)展迅速,對C+語言形成了有力沖擊。Java 技術(shù)具有卓越的通用性、高效性、平臺移植性和安全性,廣泛應(yīng)用于個人PC、數(shù)據(jù)中心、游戲控制臺、科學(xué)超級計(jì)算機(jī)、移動電話和互聯(lián)網(wǎng),同時擁有全球最大的開發(fā)者專業(yè)社群。在全球云計(jì)算和移動互聯(lián)網(wǎng)的產(chǎn)業(yè)環(huán)境下,Java更具備了顯著優(yōu)勢和廣闊前景。Sun 公司對 Java 編程語言的解釋是:Java 編程語言是個簡單、面向?qū)ο?、分布式、解釋性、健壯、安全與系統(tǒng)無關(guān)、可移植、高性能、多線程和動態(tài)的語言。Java 平臺是基于 Java 語言的平臺。這樣的平臺非常流行。因此微軟公司推出了與之競爭的.NET平臺以及模仿Java的C#語言。Java是功能完善的通用程序設(shè)計(jì)語言,可以用來開發(fā)可靠的、要求嚴(yán)格的應(yīng)用程序。1.2 超級瑪麗游戲的歷史1985年9月,讓全球無數(shù)玩家深深著迷,同時也開啟了電玩業(yè)界嶄新時代的動作游戲超級瑪麗兄弟( Super Mario Bros.)在日本當(dāng)紅的電視游樂器“Family Computer(FC,俗稱紅白機(jī))”上 閃耀登場,至今已25 個年頭。馬里奧的出道可以追溯到1981年的街機(jī)游戲大金剛,那時還沒有馬里奧這個名字,只是單純地將他設(shè)定為一個意大利人角色。當(dāng)時對馬里奧有 “Mr.電子游戲”、“跳躍人”等非正式的稱呼。關(guān)于正式命名還有一段典故。當(dāng)游戲大金剛被拿到美國任天堂分部的時候,公司員工發(fā)現(xiàn)在有一個在倉庫中工作的工人Mario,相貌和動作酷似游戲中的“跳躍人”,于是“馬里奧”也就成了這個明星角色的正式名字。1953年有一部法國電影恐怖的報(bào)酬,主人公名叫馬里奧,搭檔名叫路易基。帽子加背帶工作服、大鼻子和胡子等特征,離英雄的形象相差甚遠(yuǎn)。再加上少許肥胖的身材,稍不留神可能就會把我們的英雄馬里奧當(dāng)成在便利店打工的中年大叔。但是形象上所帶來的個性和親切感,卻在玩家的心中根深蒂固。馬里奧的誕生之父宮本茂的設(shè)計(jì)理念就是“像記號一般讓人一目了然的外貌,容易表現(xiàn)動作的配色”。當(dāng)時限于硬件的機(jī)能,無法表現(xiàn)精密的畫面。為了清楚表現(xiàn)人物的動作,就把馬里奧的服裝設(shè)計(jì)成了背帶工作服,這樣可以很好地表現(xiàn)出手臂的動作。關(guān)于臉部的設(shè)計(jì),當(dāng)時的考慮是,就算設(shè)計(jì)得很仔細(xì),在電視上也無法表現(xiàn)出來。有特點(diǎn)、容易辨認(rèn),才是設(shè)計(jì)的重點(diǎn)。所以就有了大鼻子、留胡子、戴帽子的設(shè)計(jì)。2. 基本概要2.1 游戲應(yīng)用環(huán)境的構(gòu)建2.1.1游戲需要的硬件環(huán)境普通PCCPU :1GHz及以上內(nèi)存 : 256MB及以上分辨率 :推薦1024*768像素2.1.2游戲需要的軟件環(huán)境操作系統(tǒng) :Windows xp/7開發(fā)環(huán)境 :eclipse開發(fā)工具包 :JDK2.2 操作本游戲?yàn)槿I盤操作。進(jìn)入主界面后,按P鍵可以選擇關(guān)卡,Enter鍵進(jìn)入游戲。A鍵和D鍵分別控制瑪麗左右移動。J鍵為加速鍵。K鍵控制瑪麗跳躍。2.3 游戲界面進(jìn)入游戲后,按P鍵選擇關(guān)卡,按Enter鍵開始游戲。游戲開始界面如圖(圖2-1)所示:圖2-1 開始界面游戲進(jìn)行中的畫面如圖(圖2-2、圖2-3)所示:圖(2-2)為游戲剛開始的畫面: 圖2-2 游戲畫面-1 圖(2-3)為第二關(guān)剛開始的畫面:圖2-3 游戲畫面-23. 系統(tǒng)分析3.1 本程序需要解決的主要技術(shù)問題1.如何實(shí)現(xiàn)地圖:如何實(shí)現(xiàn)地圖的繪制,如何實(shí)現(xiàn)滾屏(即當(dāng)瑪麗移動時,地圖同時向后移動)。2.地圖上建筑物的實(shí)現(xiàn)。3.碰撞檢測。4.瑪麗的實(shí)現(xiàn)與控制。3.2 游戲的總體構(gòu)架根據(jù)以上分析,我們把整個游戲分為四個模塊:1.地圖模塊:主要為一個Map類,此類包含了地圖的所有信息,包括地圖背景,建筑物,敵人等。建筑物分為兩類:一類是不能產(chǎn)生變化的普通建筑物,另一類是可以被瑪麗頂?shù)拇u頭,可以產(chǎn)生金幣、蘑菇或花朵的磚頭。2.瑪麗與主線程模塊:Mario為主角瑪麗的類,在此類中定義了瑪麗的各種屬性和動作,并加入了鍵盤控制。Check類為游戲主線程類,一些主要的功能,包括瑪麗動作的實(shí)現(xiàn),與建筑物和敵人的碰撞檢測等都在此類中實(shí)現(xiàn)。3.繪制模塊:MyJPanel類。游戲中的所有事物,包括主人公瑪麗,建筑物,敵人等等,都通過調(diào)用其本身的draw()方法在此類中畫出。4.垃圾回收模塊:Rubbish類。此類為一個線程類,游戲啟動時隨主線程Check的啟動而啟動,實(shí)時檢測游戲中產(chǎn)生的垃圾并回收,減少對系統(tǒng)資源的占用,優(yōu)化游戲的運(yùn)行。系統(tǒng)結(jié)構(gòu)圖如下圖(圖3-1)所示:超級瑪麗地圖模塊瑪麗與主線程模塊繪制模塊垃圾回收模塊圖3-1 系統(tǒng)結(jié)構(gòu)3.3 程序的類結(jié)構(gòu)以及流程圖3.3.1 類結(jié)構(gòu)圖3-2 類結(jié)構(gòu)如上圖(圖3-2)所示,本游戲的主要類結(jié)構(gòu)為: Mario類。本類為主角瑪麗的實(shí)現(xiàn)類,瑪麗的動作與控制,以及繪制等方法都在本類中定義。 Check類。本類為主要線程類,瑪麗的動作,與建筑物、磚頭以及敵人的碰撞檢測,發(fā)子彈,地圖的滾屏等等都在本線程類中實(shí)現(xiàn)。 Map類。本類為地圖類。地圖上所有的對象,包括建筑物,磚頭,敵人等都為此類的屬性。 Creature類。本類為所有敵人,蘑菇,花朵和金幣的父類,本類為線程類,在其具體的子類中定義了相應(yīng)動作。 Brick類。本類為所有磚頭類的父類,為線程類。在其具體的子類中定義了相應(yīng)的動作。 CrashCheck類。本類定義了碰撞檢測的方法。 MyJPanel類。游戲中所有的對象都在此類中繪制。 Music類。本類為游戲的背景音樂類。 Rubbish類。本類為垃圾檢測和回收類。文件夾結(jié)構(gòu)為: audio文件夾。本文件夾存儲游戲的所有聲音文件。 image文件夾。本文件夾存儲游戲的所有圖片文件。 maps文件夾。本文件夾包含游戲的地圖文件。3.3.2 流程圖游戲流程圖如下圖(圖3-3)所示:開始選擇關(guān)卡默認(rèn)加載地圖進(jìn)入游戲通關(guān)否是游戲結(jié)束圖3-3 流程圖4. 詳細(xì)設(shè)計(jì)及實(shí)現(xiàn)4.1 地圖的實(shí)現(xiàn)地圖的實(shí)現(xiàn)是本游戲的一個主要難點(diǎn)。設(shè)計(jì)思路為把地圖信息記錄在一個文本文件map.txt中,當(dāng)游戲啟動時,由一個專門類CreateMap的靜態(tài)方法loadMap()來實(shí)現(xiàn)加載地圖功能。這樣做的好處是,當(dāng)改變文本文件的內(nèi)容時,就可以改變地圖布局,從而可以很方便地設(shè)計(jì)地圖。4.1.1地圖的結(jié)構(gòu)地圖信息在一個Map類中保存,此類的主要結(jié)構(gòu)為:1.屬性 數(shù)組tile。此數(shù)組用來保存普通建筑物對象。 集合brickList。此集合用來保存可以被頂,可以頂出蘑菇和花朵和金幣的磚頭或問號對象。 集合creatureList。此集合用來保存敵人,蘑菇,花朵和金幣對象。 對象background。此對象為地圖的背景對象。2.方法 moveLeft()。此方法的功能是將地圖向左移動,滾屏?xí)r使用。 draw()。此方法為地圖的繪制方法,包含地圖中所有對象(背景,建筑物,磚頭,敵人)的繪制方法。因此只需要在MyJPanel類的paint()方法中調(diào)用此方法,便可將地圖上的所有對象畫出。4.1.2約定規(guī)則圖4-1 地圖文件 地圖文件如上圖(圖4-1)所示。約定的對應(yīng)規(guī)則為: 大寫字母AI 分別對應(yīng)相應(yīng)的普通建筑物。 大寫字母JL分別對應(yīng)相應(yīng)的磚頭。其中字母J對應(yīng)可以頂碎的磚頭(當(dāng)為小瑪麗時磚頭僅上下移動一下,為大瑪麗時可以頂碎),字母K對應(yīng)可以頂出蘑菇或花朵的磚頭(當(dāng)為小瑪麗時頂出可以變大的蘑菇,當(dāng)為大瑪麗時則頂出可以發(fā)子彈的花朵)。字母L對應(yīng)可以頂出多個金幣的磚頭(固定為8個金幣)。 大寫字母R和S分別對應(yīng)可以頂出蘑菇或花朵的磚頭(當(dāng)為小瑪麗時頂出可以變大的蘑菇,當(dāng)為大瑪麗時則頂出可以發(fā)子彈的花朵)和可以頂出一個金幣的磚頭。 大寫字母O對應(yīng)金幣。 大寫字母Z對應(yīng)地圖的出口。即到達(dá)此處地圖結(jié)束,進(jìn)入下一關(guān)地圖。 數(shù)字代表敵人。數(shù)字1代表毛毛蟲,2代表烏龜。 地圖左上角符號#后邊的三個字符,分別表示:第一個表示地圖的背景類型,第二個表示瑪麗在此地圖的初始位置,第三個數(shù)字表示此地圖結(jié)束后下一個銜接的地圖編號。按上述地圖文件產(chǎn)生的對應(yīng)的游戲畫面如圖(圖4-2)所示:圖4-2 對應(yīng)的游戲地圖畫面4.1.3地圖的產(chǎn)生產(chǎn)生地圖時,調(diào)用CreateMap類中的靜態(tài)方法loadMap(),調(diào)用時將要加載的地圖文件以參數(shù)的形式傳入。此方法的工作流程為: 產(chǎn)生一個Map對象map。 讀取地圖文件,依據(jù)上述對應(yīng)規(guī)則,在相應(yīng)位置產(chǎn)生相對應(yīng)的對象(位置通過對象本身的坐標(biāo)屬性x和y體現(xiàn))。并將產(chǎn)生的對象加入地圖相應(yīng)屬性:建筑物對象加入數(shù)組map.tile,磚頭對象加入集合map.brickList,敵人,蘑菇,花朵和金幣對象加入集合map.creatureList。 返回 map對象。map對象即為產(chǎn)生的地圖類。在MyJPanel中調(diào)用map.draw(),即可將地圖畫出。4.2 滾屏的實(shí)現(xiàn)4.2.1原理在主人公瑪麗向右移動,并到達(dá)一定位置時,讓其橫坐標(biāo)不再變化,同時調(diào)用map.moveLeft()方法,使地圖向左移動,實(shí)現(xiàn)滾屏效果。由于瑪麗的移動速度不是固定的,因此在map.moveLeft()方法中也不能使用固定數(shù)值。將瑪麗的移動速度保存在瑪麗的一個整型數(shù)值屬性speed中,并通過一個中間數(shù)值將其傳入到map.moveLeft()方法中,使瑪麗的移動速度和地圖的移動速度始終同步。4.2.2地圖內(nèi)部對象的移動地圖的移動體現(xiàn)在地圖屬性map.X的數(shù)值變化上,剛開始,map.X為零,表明在地圖的最開始。隨著瑪麗向右移動,地圖向左移動,map.X的值逐漸變小。在地圖內(nèi)部的所有固定對象(即相對于地圖位置不變的對象),都有X,Y和想x,y這兩對坐標(biāo)屬性,其中X,Y表示此對象相對于地圖的位置,這一對數(shù)值在對象生成那一刻起就不會再變化。x,y表示此對象的實(shí)際位置,即在屏幕上畫出時的坐標(biāo)。在畫出此對象前,先執(zhí)行代碼:this.x=this.X+map.X;即可保證隨著地圖的移動,此對象相對于地圖的位置不變。在地圖內(nèi)部的所有非固定對象(即相對于地圖的位置會發(fā)生變化的對象,例如敵人對象會自己移動),除了具有X,Y、x,y這兩對坐標(biāo)屬性外,還具有另外一對屬性xm,ym。其中前兩對屬性的意義與固定對象中的意義相同,而后者xm,ym這一對代表對象自身移動產(chǎn)生的位移。在畫出此對象前,執(zhí)行代碼:this.x=this.X+map.X+this.xm;即可保證隨著地圖的移動,此對象跟著移動,并且由于自身的移動,其相對于地圖的位置也會變化。4.2.3小結(jié)綜上,當(dāng)瑪麗移動時地圖向左移動,地圖內(nèi)部對象通過計(jì)算產(chǎn)生新的坐標(biāo),跟著地圖一起移動,實(shí)現(xiàn)了地圖的滾屏。4.3 地圖切換的實(shí)現(xiàn)當(dāng)進(jìn)入下一關(guān)或者瑪麗進(jìn)入可以換場景的水管時,需要切換到相應(yīng)的地圖。1. 進(jìn)入下一關(guān)時。這種情況比較簡單。在每一關(guān)的map地圖類里用一個字符串屬性nextMap記錄下一關(guān)的地圖文件的路徑,當(dāng)滿足某種條件需要進(jìn)入下一關(guān)時,調(diào)用CreateMap類里構(gòu)造地圖的方法loadMap(),把nextMap里的路徑內(nèi)容當(dāng)做參數(shù)傳入,構(gòu)造出下一關(guān)的地圖,并替換當(dāng)前地圖即可。2. 進(jìn)入換場景水管時。這種情況稍微復(fù)雜一些,因?yàn)檫€要從水管出來,所以必須要先將當(dāng)前地圖map對象保存在一個Map類型的數(shù)組mapRecord中,然后再根據(jù)水管中記錄的地圖信息構(gòu)建地圖場景,然后替換當(dāng)前地圖。當(dāng)從水管中出來時,將mapRecord中保存的地圖對象替換掉當(dāng)前地圖對象即可。4.4 碰撞檢測4.4.1原理碰撞檢測為本游戲的基礎(chǔ)?,旣?,敵人等對象在建筑物上移動而不下落,遇到障礙物時不能繼續(xù)移動或向相反方向移動,以及子彈和敵人的碰撞都需要用到碰撞檢測。碰撞檢測的方法為CrashCheck類中的一系列靜態(tài)方法,共有四類: upCheck(a,b)檢測b對象是否在a對象的上方,如果是,返回true;否返回false; downCheck(a,b)檢測b對象是否在a對象的下方,如果是,返回true;否返回false; leftCheck(a,b)檢測b對象是否在a對象的左方,如果是,返回true;否返回false; rightCheck(a,b)檢測b對象是否在a對象的右方,如果是,返回true;否返回false;根據(jù)檢測對象的不同又具體分為不同的方法,但同一類的方法(即檢測同一方向的方法)是同名的,即運(yùn)用了方法的重載。例如要檢測b對象是夠在a對象的上方,不管a,b是哪一種類的對象,都可以運(yùn)用靜態(tài)方法CrashCheck. upCheck(a,b)來檢測,大大地簡化了碰撞檢測方法的調(diào)用。4.4.2碰撞檢測在游戲中的應(yīng)用碰撞檢測在游戲中的應(yīng)用分為以下幾種情況: 瑪麗與建筑物的碰撞檢測:當(dāng)瑪麗下方有建筑物時,縱向速度v置零。當(dāng)瑪麗左右方向碰到建筑物時,令其橫向位置變?yōu)榫o貼建筑物,避免其進(jìn)入建筑物。當(dāng)瑪麗跳躍頭頂?shù)浇ㄖ飼r,令瑪麗的縱向速度v置零,讓其自由下落。如果被頂?shù)慕ㄖ飼r線程磚頭,則啟動磚頭線程,并執(zhí)行相應(yīng)的動作。 瑪麗與敵人的碰撞檢測:當(dāng)瑪麗跳躍踩到敵人時,令瑪麗向上彈起。并讓敵人執(zhí)行相應(yīng)動作。當(dāng)瑪麗在左右或上方碰到敵人時,令瑪麗變小或死亡。 子彈與建筑物的碰撞檢測:當(dāng)子彈下方有建筑物時,令子彈以一固定的速度向上彈起。當(dāng)子彈在左右方向碰到建筑物時,結(jié)束子彈線程,并將其標(biāo)識為垃圾對象。 子彈與敵人的碰撞檢測:當(dāng)子彈無論在哪個方向碰到敵人時,結(jié)束子彈線程,并標(biāo)識為垃圾對象,結(jié)束敵人線程,并標(biāo)識為垃圾對象,敵人死亡。敵人與建筑物的碰撞檢測:當(dāng)敵人下方有建筑物時,縱向速度v置零。當(dāng)敵人左右方向碰到建筑物時,改變其移動方向。4.5 瑪麗以及鍵控處理的實(shí)現(xiàn)瑪麗為本游戲的主人公,我們可以通過鍵盤控制瑪麗的行走,加速,跳躍和攻擊等行為,來通過關(guān)卡。4.5.1 Mario類的實(shí)現(xiàn)主人公mario對象為Mario類的一個對象。此類的主要結(jié)構(gòu)為:1.屬性 布爾值屬性alive。此屬性代表瑪麗的死活,當(dāng)alive為false時瑪麗死掉,游戲結(jié)束。 整型屬性blood。此屬性代表瑪麗的狀態(tài)。blood等于1時為小瑪麗(初始狀態(tài)),等于2時為大瑪麗(吃蘑菇后達(dá)到),等于3時可以發(fā)子彈(吃花朵后達(dá)到)。 布爾值屬性speedUp。speedUp為true時瑪麗為加速狀態(tài),為false時瑪麗為普通狀態(tài) 整型屬性speed。代表瑪麗的移動速度。 布爾值屬性fireOn。fireOn為true時代表瑪麗為發(fā)子彈的狀態(tài)。2.方法 moveLeft()。此方法可以實(shí)現(xiàn)瑪麗向左移動。 moveRight()。此方法可以實(shí)現(xiàn)瑪麗向右移動。 moveUp()。此方法可以實(shí)現(xiàn)瑪麗的跳躍。 draw()。此方法將瑪麗畫出來。通過多個圖片快速切換來實(shí)現(xiàn)瑪麗運(yùn)動的效果?,旣惖男蜗笕鐖D(圖4-3,圖4-4)所示:圖4-3 小瑪麗圖4-4 大瑪麗4.5.2鍵控處理通過讓Mario類繼承KeyListener接口,并在KeyListener接口的默認(rèn)方法中添加代碼來實(shí)現(xiàn)鍵盤對瑪麗行為的控制。 當(dāng)按下A鍵時調(diào)用mario.moveLeft()方法,瑪麗向左移動。 按下D鍵時,調(diào)用mario.moveRight()方法,瑪麗向右移動。 按下J鍵時,speedUp置true,瑪麗處于加速狀態(tài)。 按下K鍵時,調(diào)用mario.moveUp()方法,瑪麗跳躍。瑪麗跳躍的畫面如圖(圖4-5)所示:圖4-5 瑪麗跳躍畫面4.6 磚頭的實(shí)現(xiàn)4.6.1分類磚頭共分為5類: 普通磚頭。即能被頂碎的磚頭(如果是小瑪麗頂,則上下移動一下,如果是大瑪麗,則被頂碎)。 能夠頂出蘑菇或花朵的磚頭(如果是小瑪麗頂,則會出現(xiàn)能夠變大的蘑菇,如果是大瑪麗頂,則會出現(xiàn)花朵)。 能夠頂出金幣的磚頭(固定為8個金幣)。 能夠頂出蘑菇或花朵的問號(如果是小瑪麗頂,則會出現(xiàn)能夠變大的蘑菇,如果是大瑪麗頂,則會出現(xiàn)花朵)。 能夠頂出金幣的問號(能頂出一個)。4.6.2結(jié)構(gòu)這五個磚頭類都為線程類,它們繼承同一個父類Brick。它們的主要結(jié)構(gòu)為:1.屬性 整型變量X,Y。這一對變量代表此對象相對于地圖的位置坐標(biāo)(對象產(chǎn)生后不會再變化)。 整型變量x,y。這一對變量代表此對象的實(shí)際位置坐標(biāo)(即畫出時的坐標(biāo))。 字符型變量type。此變量代表磚頭的種類。 布爾型變量start。此變量表示線程是否啟動。 布爾型變量alive。此變量表示線程是否還存活。2.方法 draw()。此方法將對象畫出。 run()。為線程方法。此方法定義了不同類型磚頭在被瑪麗頂后的不同行為。游戲啟動時,在地圖相應(yīng)的位置產(chǎn)生對應(yīng)的磚頭,并將其加入map.brickList,但此時并不啟動磚頭線程,而是當(dāng)被瑪麗頂后相應(yīng)的磚頭線程才會啟動,這樣大大節(jié)省了系統(tǒng)資源,避免了浪費(fèi)。4.7 敵人的實(shí)現(xiàn)4.7.1分類敵人共分為2類: 毛毛蟲。只能左右爬動,遇到障礙物或其它敵人后改變方向。當(dāng)腳下沒有建筑物時,受到重力作用下落。被瑪麗踩到或被子彈打到時死亡。從其他地方碰到瑪麗后,瑪麗變小或死亡。毛毛蟲如圖(圖4-6)所示:圖4-6 毛毛蟲毛毛蟲死亡如圖(圖4-7)所示:圖4-7 毛毛蟲死亡 烏龜。只能左右爬動,遇到障礙物或其它敵人后改變方向。當(dāng)腳下沒有建筑物時,受到重力作用下落。不能被瑪麗踩死,只能被子彈打死。從其他地方碰到瑪麗后,瑪麗變小或死亡。烏龜如圖(圖4-8)所示:圖4-8 烏龜烏龜死亡如圖(圖4-9)所示:圖4-9 烏龜死亡4.7.2結(jié)構(gòu)這兩個敵人類都為線程類,繼承同一個父類Creature。它們的主要結(jié)構(gòu)為:1.屬性 整型變量X,Y。這一對變量代表此對象相對于地圖的位置坐標(biāo)(對象產(chǎn)生后不會再變化)。 整型變量x,y。這一對變量代表此對象的實(shí)際位置坐標(biāo)(即畫出時的坐標(biāo))。 整型變量xm,ym。這一對變量代表對象本身移動產(chǎn)生的位移。 字符型變量type。此變量代表敵人的種類。 布爾型變量start。此變量代表線程是否啟動。 布爾型變量alive。此變量代表對象是否存活。2.方法 draw()。此方法將對象畫出。 moveLeft()。此方法可以讓對象向左移動。 moveRight()。此方法可以讓對象向右移動。 run()。為線程方法。此方法定義了不同類型敵人的不同行為。游戲啟動時,在地圖相應(yīng)的位置產(chǎn)生對應(yīng)的敵人,并將其加入map.enemyList,但此時敵人線程并不啟動,而是當(dāng)其實(shí)際位置移動到窗口附近時才會啟動。這樣大大節(jié)省了系統(tǒng)資源,避免了浪費(fèi)。4.8 重力模擬為了讓游戲更加逼真,我們對游戲中的每個自由對象(瑪麗、敵人以及子彈)施加重力,讓其模擬現(xiàn)實(shí)中的物體,在其下方?jīng)]有物體支撐時,作自由落體運(yùn)動。具體實(shí)現(xiàn)方法:在每個生物線程里,加入如下重力實(shí)現(xiàn)代碼。this.y+=v;v+=G;其中v代表對象的縱向速度,正值為朝下,負(fù)值為朝上。初始值為零。G為一個整型常量,代表重力加速度,值恒為1。線程運(yùn)行過程中,先檢測對象下方有無建筑物支撐,如果有,則v置零,如果沒有,則運(yùn)行上述重力實(shí)現(xiàn)代碼。重復(fù)上述過程,令其模擬物體受到重力作用。5. 游戲的優(yōu)化及注意點(diǎn)5.1 游戲中屏幕繪制技術(shù)的優(yōu)化在屏幕繪制模塊中,包括兩個部分:瑪麗的繪制與地圖的繪制。它們的繪制方法是在MyJPanel類中的paint()方法中調(diào)用繪制方法mario.draw()和map.draw()。在其具體的實(shí)現(xiàn)方法中,瑪麗的情況很簡單,只需要在mario類中添加多個瑪麗動作的分解圖片屬性,然后在其draw()方法中按一定規(guī)律交替畫出這些圖片即可實(shí)現(xiàn)瑪麗的繪制與運(yùn)動。地圖的繪制就較為復(fù)雜,因?yàn)樵谄鋎raw()方法中,包含了多個不同類型對象的繪制方法,包括背景,建筑物,磚頭,敵人等等。在這些對象的繪制過程中,必須要注意其繪制的先后順序,例如背景必須最先繪制,否則就會蓋住其它內(nèi)容。然后再是建筑物,磚頭,敵人等。在滾屏的實(shí)現(xiàn)一章中,我們提到過在地圖繪制前,要對其內(nèi)部的所有對象進(jìn)行坐標(biāo)計(jì)算,即對所有對象執(zhí)行代碼:this.x=this.X+map.X或this.x=this.X+map.X+this.xm,然后再執(zhí)行繪制代碼?,F(xiàn)在有兩個方案: 對地圖內(nèi)的某個對象,先執(zhí)行坐標(biāo)計(jì)算代碼,然后執(zhí)行繪制代碼,然后再計(jì)算和繪制下一個對象。 先對地圖內(nèi)所有對象執(zhí)行坐標(biāo)計(jì)算代碼,然后再對所有對象執(zhí)行繪制代碼。經(jīng)過分析可知,第一種方案中每個對象繪制之間的時差較大(中間隔了坐標(biāo)計(jì)算代碼),因此在地圖滾屏?xí)r可能會造成建筑物變形的現(xiàn)象(接口處錯開)。而第二種方案,每個對象的繪制是接連進(jìn)行的,中間沒有太多時差,所以大大減少第一種方案中造成的建筑物變形現(xiàn)象。經(jīng)過實(shí)驗(yàn),確實(shí)如此。因此采用第二種方案。5.2 游戲中新對象的產(chǎn)生和垃圾收集1.新對象的產(chǎn)生在本游戲中,對象的產(chǎn)生大部分是在游戲剛啟動時,比如,建筑物、磚頭、敵人等等。有一小部分是在游戲中產(chǎn)生的,如瑪麗發(fā)出的子彈,蘑菇,花朵和頂出的金幣等。2.垃圾收集在游戲運(yùn)行過程中,要實(shí)時進(jìn)行垃圾收集,否則占用系統(tǒng)資源過多,會造成游戲卡頓,運(yùn)行不暢。收集垃圾前,要先鑒定一個對象是否為垃圾對象,將垃圾對象進(jìn)行標(biāo)識。具體為: 子彈對象的鑒定:當(dāng)子彈移出屏幕之外,或者打中敵人,或者碰到建筑物后,標(biāo)識為垃圾對象。 磚頭對象的鑒定:當(dāng)磚頭被頂碎后標(biāo)識為垃圾對象。 敵人對象的鑒定:當(dāng)敵人被殺死或掉到窗口下方后標(biāo)識為垃圾對象。 其他對象的鑒定:當(dāng)蘑菇,花朵,金幣對象被瑪麗吃掉后,標(biāo)識為垃圾對象。本游戲中用一個獨(dú)立的線程Rubbish來時刻檢測和收集垃圾對象,此線程隨游戲主線程的啟動而啟動,將標(biāo)識為垃圾的對象線程停止,然后移出數(shù)組或集合,保證程序的流暢運(yùn)行,減少對系統(tǒng)資源的占用。5.3 游戲?qū)ο到y(tǒng)資源占用的優(yōu)化1.線程的優(yōu)化游戲啟動時,加載地圖上所有對象,但是并不啟動所有線程。各類線程的啟動時間為: 磚頭線程。磚頭線程只有在被瑪麗頂?shù)綍r才會啟動。 敵人線程。只有當(dāng)敵人的實(shí)際坐標(biāo)位置快要進(jìn)入窗口時,才會啟動線程。2.繪制的優(yōu)化在對地圖內(nèi)所有對象繪制之前,先對對象的坐標(biāo)進(jìn)行檢測,只有當(dāng)對象處在窗口之內(nèi)時才會執(zhí)行繪制代碼。通過以上優(yōu)化,減少了不必要的線程和繪制,大大節(jié)省了系統(tǒng)資源,提高了游戲運(yùn)行效率。6. 總結(jié)做事要積極主動,態(tài)度決定一切,不得不說,同樣的事,同一水平線,不同人做的時候,態(tài)度和積極性就決定著一切,所以一個人只要工作態(tài)度好,我相信這個人的工作絕對不會差。就為解決一個問題,我們可能連續(xù)十幾甚至幾十小時的坐在計(jì)算機(jī)前不停的工作。一個問題解決了,可能又有其它的問題出現(xiàn)。而你要是不能堅(jiān)持下來,可能從前的一切努力都流失了。輕易言敗的人請不要做程序員,你不可能成功。執(zhí)著是最可貴的。整個程序設(shè)計(jì)的過程就是一個研究學(xué)習(xí),應(yīng)用,再研究學(xué)習(xí),再應(yīng)用的過程。一名優(yōu)秀的程序員決不會認(rèn)為自己足夠好了,不需要再提高了。自滿自足的人不會是好程序員,會很快落后以致落伍。所以越是優(yōu)秀的程序員越是感覺自己懂得少,不會在人前故意賣弄,這并不是故作謙虛,而是實(shí)實(shí)在在的感受,親自體會才能明白。虛心請教不懂就要問,如果是單純技術(shù)上的問題,如果可以百度到的,我認(rèn)為就可以自己消化掉!問的問題一定要先百度,然后帶著自己的想法,去問一些有經(jīng)驗(yàn)的人,收獲會更大!浮華的程序員會不懂裝懂,不停的強(qiáng)調(diào)語言的優(yōu)劣,平臺的好壞。追求所謂最新最時尚的技術(shù),停留在表面問題上。優(yōu)秀的程序員是充滿激情和活力的程序員。求知欲和創(chuàng)造欲是原動力。有求知欲你才能不停的學(xué)習(xí),有創(chuàng)造欲你才能不停的超越自己。很多程序員都是在失敗的時候強(qiáng)調(diào)客觀因素,而優(yōu)秀的程序員的程序員都是先反省自己。要明白自己缺陷,再努力去學(xué)習(xí)。沒有人事事都做的成功,也沒有人生來就什么會做。所以失敗了,多想想自身的原因,這樣你才會不停的進(jìn)步,而不是留在原地抱怨。要想飛的更高,我需要一雙有力的翅膀,一雙有力的翅膀,是飛行的最基本的支撐和前提。那什么是程序開發(fā)的最基本的支撐呢,個人感覺是構(gòu)建一個完整的關(guān)于開發(fā)的知識體系和程序員應(yīng)該具備的最基本能力。對技術(shù)迷茫過?動搖過?很正常,每個人都有過這樣的困惑,審慎的對待自己的性格、能力,并作出合理的選擇是我們這代人需要面對的問題之一,我們沒有可以參考的目標(biāo)(對于軟件行業(yè)而言,在國內(nèi)從無到有也才那么10幾年時間,自然沒有什么參考對象),也不像我們的父輩一樣無法選擇,展現(xiàn)在我們面前的是一條更加寬廣的路,也是一條充滿了荊棘的路,所以,選擇也就更加的重要了。我越來越意識到寫程序不是僅僅把程序?qū)懗鰜?,而是要讓你寫的程序可讀,可維護(hù),并且高效。優(yōu)化正確的程序要比改正已優(yōu)化(但是有錯)的程序要容易。此次的畢業(yè)實(shí)習(xí)為我深入社會,體驗(yàn)生活提供了難得的機(jī)會,讓我在實(shí)際的社會活動中感受生活。了解社會中生存所應(yīng)具備的各種能力在工作中嚴(yán)格要求自己,虛心向他人請教,學(xué)到更多的知識,掌握一些基本的會計(jì)技能,為以后的工作和生活積累更多的知識和寶貴經(jīng)驗(yàn)。通過本次畢業(yè)設(shè)計(jì),讓我們掌握如何制作一個游戲軟件,以及制作游戲軟件的整個流程,制作游戲軟件的步驟,讓學(xué)生熟悉項(xiàng)目開發(fā)的完整過程,為即將到來的就業(yè)工作打下基礎(chǔ)。另外也通過本次設(shè)計(jì)將三年來所學(xué)的專業(yè)知識和其他方面的知識融入到實(shí)際應(yīng)用中,在實(shí)際運(yùn)用中學(xué)習(xí)和掌握J(rèn)ava程序開發(fā)的全過程,進(jìn)一步熟悉掌握J(rèn)ava程序設(shè)計(jì)語言的基礎(chǔ)內(nèi)容、基本技能和方法,同時培養(yǎng)學(xué)生進(jìn)行分析問題、解決問題的能力;培養(yǎng)學(xué)生進(jìn)行設(shè)計(jì)分析、設(shè)計(jì)方法、設(shè)計(jì)操作與測試、設(shè)計(jì)過程的觀察、理解和歸納能力的提高。參考文獻(xiàn)1 圖書作者: 美David Wallace Croft 著 彭暉 譯 圖書名稱:Java游戲高級編程游戲開發(fā)經(jīng)典叢書 出版社: 清華大學(xué)出版社 出版時間: 2005-8第1版2 圖書作者:(美)韋爾斯等著,陳宗斌等譯 圖書名稱:JAVA ME 游戲編程(第2版) 圖書出版社:機(jī)械工業(yè)出版社3 圖書作者:榮欽科技 編著 圖書名稱:JAVA2游戲程序設(shè)計(jì) 出版時間:2003.06出版4 圖書作者:David Brackeen編著 邱仲潘 翻譯 圖書名稱:JAVA游戲編程 出版時間: 2004.06出版5 圖書作者:Bruce Eckel著 陳昊鵬 譯. 圖書名稱:Java編程思想. M 圖書出版社:北京:機(jī)械工業(yè)出版社 出版時間: 第4版.2007年6 圖書作者:王克宏主編 圖書名稱:JAVA技術(shù)及其應(yīng)用(第二版) 出版社:高等教育出版社 致謝首先,衷心地感謝高媛教師。我很想自己做一個游戲,于是在論文題目制定時,我毫不猶豫地選擇了這個題目,感謝老師能給我這樣一個實(shí)現(xiàn)自己的機(jī)會,感謝老師在這段時間對我無私的指導(dǎo)和幫助。最后,感謝大學(xué)四年間熱情幫助過我的每一位老師和同學(xué)。感謝親愛的農(nóng)大對我的栽培。附錄超級瑪麗游戲源代碼:1. Mario類:package com.day01;import java.awt.Color;import java.awt.Graphics;import java.awt.Image;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.awt.image.ImageObserver;import java.util.LinkedList;import java.util.List;import javax.swing.ImageIcon;public class Mario implements KeyListener, ImageObserverpublic int x;public int y;public int width=34;public int height=50;public Image marioIm=new Image10;public List fireList;public boolean jump=false;public boolean speedUp=false;public boolean fireOn=false;public boolean down=false;public boolean alive=true;public int direction=0;public static int facedec=2;/public boolean size=false;public int blood=1;public int i=0;public int j=0;public Mario(int x,int y)this.x=x;this.y=y;for(int i=0;imarioIm.length;i+)ImageIcon imageIcon=new ImageIcon(image/mario/+(i+1)+.gif);marioImi=imageIcon.getImage();fireList = new LinkedList();public void moveLeft()if(speedUp)x-=6;elsex-=2;facedec=1;i+;public void moveRight()if(speedUp)x+=6;elsex+=2;facedec=2;j+;public void moveUp()y-=20;public void sizeUp()this.blood=2;this.width=51;this.height=75;public void sizeUp1()this.blood=3;this.width=51;this.height=75;public void sizeDown()this.blood=1;this.width=34;this.height=50;public void draw(Graphics g)Image image = null;int m=i%20;int n=j%20;if(!jump&facedec=1)if(m=0&m=4&m=8&m=12&m=16&m=0&n=4&n=8&n=12&n=16&n=19)image=marioIm4; if(jump&facedec=1) image=marioIm6; if(jump&facedec=2) image=marioIm1; g.drawImage(image, x-(height-width)/2, y, height, height, this); /*public void draw(Graphics g)g.drawOval(x, y, width, height);*/Overridepublic void keyPressed(KeyEvent e) if(e.getKeyCode()=e.VK_A)direction=1;if(e.getKeyCode()=e.VK_D)direction=2;if(e.getKeyCode()=e.VK_S)down=true;if(e.getKeyCode()=e.VK_K)jump=true;if(e.getKeyCode()=e.VK_J)speedUp=true;if(e.getKeyCode()=e.VK_U)if(blood=3)fireOn=true;/ TODO Auto-generated method stubOverridepublic void keyReleased(KeyEvent e) if(e.getKeyCode()=e.VK_A|e.getKeyCode()=e.VK_D)direction=0;if(e.getKeyCode()=e.VK_S)down=false;if(e.getKeyCo
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年不動產(chǎn)他項(xiàng)管理合同二篇
- 健身減肥全方位指導(dǎo)手冊
- 新能源汽車技術(shù)與市場趨勢解析考試
- 概率論區(qū)塊鏈技術(shù)測試試卷
- 初中信息技術(shù)《2025編程入門教程》沖刺卷試題
- 二胡考級評分標(biāo)準(zhǔn)制定試題
- 商務(wù)合同撰寫與審核規(guī)范(標(biāo)準(zhǔn)版)
- 初中信息技術(shù)網(wǎng)絡(luò)編程基礎(chǔ)知識試卷
- 旅游產(chǎn)品開發(fā)與服務(wù)手冊
- 2025年稅務(wù)師職業(yè)資格考試報(bào)名流程試卷及答案
- 消火栓安全培訓(xùn)知識課件
- 熔鹽儲熱材料研發(fā)-洞察與解讀
- 人教版7到9年級單詞表打印版
- 2025年高壓電工復(fù)審?fù)暾}庫(附答案)
- 2025年湖北高考真題化學(xué)試題(原卷版)
- 中華姓氏大辭典
- 密閉式靜脈輸血技術(shù)操作規(guī)范
- 肢體功能障礙的心理康復(fù)課件
- 26.1.2 反比例函數(shù)的圖像和性質(zhì)第二課時作業(yè)設(shè)計(jì)
評論
0/150
提交評論