版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
PAGE第21頁(yè)共21頁(yè)學(xué)位論文泡泡堂網(wǎng)絡(luò)游戲的設(shè)計(jì)與實(shí)現(xiàn)論文作者姓名:申請(qǐng)學(xué)位專(zhuān)業(yè):申請(qǐng)學(xué)位類(lèi)別:論文提交日期:泡泡堂網(wǎng)絡(luò)游戲的設(shè)計(jì)與實(shí)現(xiàn)摘要網(wǎng)絡(luò)游戲開(kāi)發(fā)是一項(xiàng)很大的工程,需要很多綜合性的知識(shí)。這對(duì)于剛剛?cè)腴T(mén)的開(kāi)發(fā)者來(lái)說(shuō)很難理解。本論文從研究開(kāi)發(fā)一個(gè)模仿泡泡堂網(wǎng)絡(luò)游戲的例子出發(fā),講述網(wǎng)絡(luò)游戲開(kāi)發(fā)中用到的一些最基本的知識(shí)和設(shè)計(jì)思想,使大家清晰的理解游戲開(kāi)發(fā)的過(guò)程。整個(gè)設(shè)計(jì)中利用java中的swing編程,結(jié)合游戲的操作流程,對(duì)整個(gè)游戲進(jìn)行精心的設(shè)計(jì)和大量的測(cè)試,實(shí)現(xiàn)游戲軟件服務(wù)器端和客戶端的開(kāi)發(fā),為玩家提供一個(gè)友好美觀的操作界面,并添加聊天等功能以增加玩家之間的互動(dòng)性,此外實(shí)現(xiàn)了可編輯場(chǎng)景地圖的功能,使得游戲內(nèi)容的更加豐富,玩家交互性更好,確保了游戲更具有趣味性、靈活性,以滿足玩家對(duì)這款網(wǎng)絡(luò)游戲的要求。關(guān)鍵詞:消息傳輸;java-swing;網(wǎng)絡(luò)游戲;線程;場(chǎng)景TheDesignandImplementationof“PaoPaoTang”NetworkGameAbstractNetworkgamedevelopmentisabigprojectthatrequiresalotofintegrationofknowledge.Itisdifficulttounderstandforbeginnerinthisfield.ThisthesisbaseontheresearchanddevelopmentofaGamenamed“PaoPaoTang”,asanexample,itdescriptthedevelopmentoffundamentalknowledgeandtheorywhendesignanetworkgame,sothatwecanmoreclearlyunderstandthegamedevelopmentprocess.Thewholedesignusesthejava-swingprogramming,combineswiththeoperationofthegame,designstheentiregameanddoesnumeroustests,realizethegamesoftwarerunningatserverandclient,provideafriendlyandaestheticallypleasinginterfaceforplayers,andaddchatfunctionstoincreasethecommunionbetweentheplayerseachother.Inadditiontodesignsthescenemapeditingfunctionstomakethegameforrichercontentandbetterinteractivewithplayers.Finallytoensurethatthegameismorefunandflexibilityitcansatisfythenetworkgamerequirementsforplayers.Keywords:messagetransfers;java-swing;networkgame;thread;scene目錄論文總頁(yè)數(shù):21頁(yè)1 引言 11.1 課題背景 11.2 泡泡堂游戲簡(jiǎn)介 11.3 本課題研究的意義 12 開(kāi)發(fā)的環(huán)境及相關(guān)技術(shù)的介紹 22.1 開(kāi)發(fā)環(huán)境 22.2 Java語(yǔ)言的特點(diǎn) 23 需求分析 23.1 游戲的操作流程 23.2 應(yīng)該解決的問(wèn)題 44 系統(tǒng)設(shè)計(jì) 44.1 處理流程 44.2 數(shù)據(jù)流 54.3 部署方案 65 系統(tǒng)實(shí)現(xiàn) 65.1 代碼結(jié)構(gòu) 65.2 公共類(lèi)的介紹 75.3 服務(wù)器端的開(kāi)發(fā) 85.4 客戶端 95.4.1 模塊設(shè)計(jì) 95.4.2 游戲入口程序 105.4.3 登陸 105.4.4 游戲大廳 115.4.5 對(duì)戰(zhàn)場(chǎng)地 136 測(cè)試 18結(jié)論 19參考文獻(xiàn) 19致謝 20聲明 21引言課題背景最近幾年游戲產(chǎn)業(yè)特別是網(wǎng)絡(luò)游戲得到飛速發(fā)展。而隨著人們工作節(jié)奏的加快,小型的、競(jìng)技性的網(wǎng)絡(luò)游戲因?yàn)橛螒蛩钑r(shí)間短,競(jìng)技性和娛樂(lè)性強(qiáng)等特點(diǎn),越來(lái)越受到工作人士的喜愛(ài)。盛大公司推出的“泡泡堂”是一款比較好也是比較成功的網(wǎng)絡(luò)小游戲。本課題就是想對(duì)該游戲進(jìn)行分析研究,借助于它的游戲規(guī)則,用java語(yǔ)言模擬開(kāi)發(fā)一個(gè)類(lèi)似的,功能相對(duì)簡(jiǎn)單的網(wǎng)絡(luò)小游戲。從而使自己更清楚的認(rèn)識(shí)小游戲開(kāi)發(fā)需要的知識(shí)和開(kāi)發(fā)的環(huán)節(jié)和涉及到的領(lǐng)域。泡泡堂游戲簡(jiǎn)介在2004年全世界最火爆、在線人數(shù)最多的網(wǎng)絡(luò)游戲,不是《傳奇》、《奇跡》等深受歡迎的傳統(tǒng)MMO,也不是《夢(mèng)幻西游》、《劍網(wǎng)》、《巨商》等一大批后起之秀,而是盛大旗下的一款休閑游戲—《泡泡堂》?!杜菖萏谩肥琼n國(guó)第一人氣網(wǎng)絡(luò)游戲,擁有多達(dá)2500萬(wàn)的注冊(cè)用戶。它以簡(jiǎn)單趣味征服玩家。有專(zhuān)家將玩家區(qū)分為臨時(shí)玩家、中間玩家和忠實(shí)玩家三類(lèi)。而《泡泡堂》的服務(wù)對(duì)象大部分都是臨時(shí)玩家。對(duì)于這一概念的定義為:年齡層從10歲到20歲甚至35歲左右,每天平均游戲時(shí)間約為2小時(shí),希望選擇可以即刻得到結(jié)果、界面簡(jiǎn)潔的游戲。臨時(shí)玩家是互聯(lián)網(wǎng)娛樂(lè)初級(jí)階段的玩家層,對(duì)數(shù)字娛樂(lè)有一定渴望,對(duì)上手較難的游戲有畏懼感。他們比忠實(shí)玩家要更廣泛,而且還是最有開(kāi)發(fā)價(jià)值的目標(biāo)人群。有資料統(tǒng)計(jì),在美國(guó)臨時(shí)玩家和忠實(shí)玩家之間的比例大約是50:1,在中國(guó)這種差距可能會(huì)更高。而休閑游戲恰恰抓住了這些臨時(shí)玩家對(duì)互動(dòng)娛樂(lè)的需求。休閑游戲簡(jiǎn)單輕松,趣味十足,臨時(shí)玩家們?cè)诙虝r(shí)間內(nèi)就可獲得游戲所帶來(lái)的互動(dòng)趣味和成就感。這些其實(shí)是休閑游戲成功的最大法寶。開(kāi)發(fā)商非常清楚的認(rèn)識(shí)到了這一點(diǎn),他們以紅白機(jī)的《炸彈人》作為原形,針對(duì)市場(chǎng)開(kāi)發(fā)出了《泡泡堂》。使游戲操作簡(jiǎn)單,極易上手,富有樂(lè)趣,充分吸收了《炸彈人》的諸多優(yōu)點(diǎn)。在保留精髓的同時(shí),《泡泡堂》還開(kāi)發(fā)了一些有創(chuàng)意的玩點(diǎn),加入一些很有影響力的娛樂(lè)元素(Avatar),使產(chǎn)品線更豐富,滿足了臨時(shí)玩家多方面的互聯(lián)網(wǎng)娛樂(lè)需求。本課題研究的意義本課題以開(kāi)發(fā)該游戲?yàn)槠脚_(tái),綜合運(yùn)用網(wǎng)絡(luò)編程,數(shù)據(jù)之間的通訊,程序中算法的實(shí)現(xiàn),線程的分配,程序運(yùn)行中的內(nèi)存使用情況的控制等。通過(guò)這些技術(shù)的綜合運(yùn)用,更深入的了解計(jì)算機(jī)程序方面的相關(guān)知識(shí),熟悉游戲開(kāi)發(fā)的理念和流程,了解整個(gè)游戲項(xiàng)目開(kāi)發(fā)的關(guān)注點(diǎn)。該課題屬于研究性的一個(gè)課題,不考慮商業(yè)上的應(yīng)用。只是對(duì)技術(shù)研究的并不是游戲本身的娛樂(lè)性。開(kāi)發(fā)的環(huán)境及相關(guān)技術(shù)的介紹開(kāi)發(fā)環(huán)境操作系統(tǒng):MicrosoftWindowsXP開(kāi)發(fā)語(yǔ)言:java2開(kāi)發(fā)包:Java(TM)2StandardEdition(5.0),JFCSwing.IDE:Eclipse3.2測(cè)試環(huán)境:局域網(wǎng),PC機(jī)Java語(yǔ)言的特點(diǎn)1.平臺(tái)無(wú)關(guān)性Java引進(jìn)虛擬機(jī)原理,并運(yùn)行于虛擬機(jī),實(shí)現(xiàn)不同平臺(tái)之間的Java接口。Java的數(shù)據(jù)類(lèi)型與機(jī)器無(wú)關(guān)。2.安全性Java的編程類(lèi)似C++,但舍棄了C++的指針對(duì)存儲(chǔ)器地址的直接操作,程序運(yùn)行時(shí),內(nèi)存由操作系統(tǒng)分配,這樣可以避免病毒通過(guò)指針入侵系統(tǒng)。它提供了安全管理器,防止程序的非法訪問(wèn)。3.面向?qū)ο驤ava吸收了C++面向?qū)ο蟮母拍?,將?shù)據(jù)封裝于類(lèi)中,實(shí)現(xiàn)了程序的簡(jiǎn)潔性和便于維護(hù)性,使程序代碼可以只需一次編譯就可反復(fù)利用。4.分布式Java建立在TCP/IP網(wǎng)絡(luò)平臺(tái)上,提供了用HTTP和FTP協(xié)議傳送和接收信息的庫(kù)函數(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語(yǔ)言的結(jié)構(gòu)、指針、#define語(yǔ)句、多重繼承、goto語(yǔ)句、操作符、重載等不易被掌握的特性,提供垃圾收集器自動(dòng)回收不用的內(nèi)存空間。需求分析本設(shè)計(jì)主要是實(shí)現(xiàn)一個(gè)類(lèi)似于“泡泡堂”功能的網(wǎng)絡(luò)游戲。其操作流程及其主要功能如下介紹游戲的操作流程游戲的操作類(lèi)似于網(wǎng)絡(luò)游戲QQ堂。其操作流程如圖1所示。圖1游戲操作流程1.首先要先運(yùn)行服務(wù)器端,來(lái)處理各個(gè)客戶端發(fā)來(lái)的請(qǐng)求。2.玩家運(yùn)行客戶端,首先展現(xiàn)一個(gè)版權(quán)聲明的界面,因?yàn)橛螒蛑械膱D片來(lái)源于騰迅公司的QQ堂游戲,圖片的版權(quán)歸騰迅公司所有。3.幾秒后自動(dòng)跳到登錄界面。在這里輸入用戶名稱(chēng),密碼。因系統(tǒng)中沒(méi)有對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,并沒(méi)有保存用戶的相關(guān)信息,所以沒(méi)有注冊(cè)的功能,也沒(méi)有對(duì)密碼的正確與否進(jìn)行驗(yàn)證。輸入密碼后點(diǎn)擊登錄進(jìn)入游戲大廳,退出則關(guān)閉程序。4.進(jìn)入大廳后,用戶可以選擇自己的角色,藍(lán)隊(duì)或者紅隊(duì),并可以進(jìn)行聊天對(duì)話。點(diǎn)擊準(zhǔn)備時(shí)將進(jìn)入準(zhǔn)備狀態(tài)。當(dāng)所有用戶都進(jìn)入準(zhǔn)備狀態(tài),游戲自動(dòng)進(jìn)入對(duì)戰(zhàn)場(chǎng)地進(jìn)行對(duì)戰(zhàn)游戲。5.在對(duì)戰(zhàn)時(shí),玩家可以用方向鍵盤(pán)控制人物的移動(dòng),人物只能在空地中移動(dòng),當(dāng)遇到“箱子”時(shí),可以使用“空格鍵”放置“泡泡”,利用“泡泡”的爆炸的威力去破壞周?chē)恼系K物(“仙人掌”不能被破壞掉)。同時(shí)可以一連串放置多個(gè)“泡泡”,放置“泡泡”后,“泡泡”將持續(xù)幾秒鐘才會(huì)爆炸,在這段時(shí)間玩家可以放置更多的“泡泡”來(lái)攻擊對(duì)手,在運(yùn)動(dòng)過(guò)程中還要及時(shí)躲開(kāi)“泡泡”的爆炸區(qū)域。當(dāng)玩家被“泡泡”炸中,則該玩家的生命將結(jié)束,不能繼續(xù)進(jìn)行游戲6.當(dāng)有一個(gè)隊(duì)中的所有玩家都死掉,則該隊(duì)挑戰(zhàn)失敗,對(duì)方獲勝。應(yīng)該解決的問(wèn)題本程序需要解決的主要問(wèn)題:1. 游戲程序是一項(xiàng)精度要求很高的程序系統(tǒng),因?yàn)槠浯a利用率很高。一個(gè)實(shí)時(shí)運(yùn)行的最終作品,每秒都會(huì)運(yùn)行成千上萬(wàn)行程序,繪圖事件、鍵盤(pán)事件都會(huì)以極高的頻率在后臺(tái)等待響應(yīng),若有絲毫的差別都將很容易導(dǎo)致程序在運(yùn)行不久后可能出現(xiàn)嚴(yán)重錯(cuò)誤,甚至死循環(huán)。因此,其邏輯設(shè)計(jì)應(yīng)當(dāng)相當(dāng)嚴(yán)謹(jǐn),需將所有可能發(fā)生的事件及意外情況考慮在設(shè)計(jì)中。2. 網(wǎng)絡(luò)計(jì)算機(jī)之間的數(shù)據(jù)通訊:用socket進(jìn)行編程,同時(shí)由于對(duì)人同時(shí)游戲,要盡量減少網(wǎng)絡(luò)數(shù)據(jù)的傳輸量,提高傳輸效率,防止堵塞。3. 算法的設(shè)計(jì):算法是游戲的核心,要設(shè)計(jì)很好的算法,提高游戲運(yùn)行的效率,運(yùn)行速度要高,并且資源占用的要少。4. 線程的控制:由于涉及到對(duì)個(gè)玩家,并且要即時(shí)的將數(shù)據(jù)進(jìn)行網(wǎng)絡(luò)傳輸,因此可以用多個(gè)線程來(lái)并發(fā)執(zhí)行這些操作。線程之間的同步和調(diào)度上要很好的控制。5. 雙緩存:在圖片之間相互調(diào)用轉(zhuǎn)換時(shí),圖像的畫(huà)面要流暢,不能有停頓和閃爍6. 游戲中為了美觀,適用性強(qiáng),可能需要采用外部文件引入的圖片貼圖,有關(guān)貼圖,這里使用了QQ堂游戲里的一些截圖來(lái)美化界面,同時(shí)對(duì)解決靜態(tài)或動(dòng)態(tài)、畫(huà)面背景、屏幕刷新的雙緩沖等都有較好的解決方案。以上相關(guān)技術(shù)細(xì)節(jié)和整體流程將分別在以下小節(jié)闡述。系統(tǒng)設(shè)計(jì)本游戲開(kāi)發(fā)采用C/S結(jié)構(gòu),分為服務(wù)器端和客戶端兩部分。處理流程服務(wù)器端主要處理各個(gè)客戶端發(fā)過(guò)來(lái)的消息(Message),并根據(jù)消息的類(lèi)型,對(duì)消息進(jìn)行不同的處理,然后將處理后的消息轉(zhuǎn)發(fā)或者直接轉(zhuǎn)發(fā)消息到所有玩家??蛻舳藙t監(jiān)聽(tīng)用戶的輸入動(dòng)作,包括鍵盤(pán)和鼠標(biāo)動(dòng)作,對(duì)于不同的動(dòng)作做不同的處理,并根據(jù)玩家動(dòng)作的類(lèi)型,把所有信息封裝為一個(gè)消息的實(shí)體(Message),然后發(fā)到服務(wù)器端。同時(shí)要監(jiān)聽(tīng)服務(wù)器端的回復(fù)過(guò)來(lái)的消息當(dāng)收到一個(gè)新的消息,將對(duì)消息進(jìn)行解析,根據(jù)消息的類(lèi)型作不同的處理,從而改變游戲場(chǎng)景或者狀態(tài)等。處理流程如圖2所示。圖2處理流程數(shù)據(jù)流在整個(gè)系統(tǒng)中,客戶端和服務(wù)器端所有的信息都是通過(guò)一個(gè)封裝的Message來(lái)傳輸?shù)?,它們的傳輸?shù)據(jù)流如圖3所示(這里以一次通訊為例)圖3數(shù)據(jù)流當(dāng)一個(gè)客戶端把玩家的動(dòng)作封裝為一個(gè)的消息,之后發(fā)送到服務(wù)器端。服務(wù)器端接收到該消息,并對(duì)該消息進(jìn)行解析處理。然后將處理過(guò)的消息轉(zhuǎn)發(fā)給當(dāng)前的所有客戶端,包括消息的發(fā)出者。客戶端收到該消息,根據(jù)消息的類(lèi)型來(lái)解析,然后處理并改變當(dāng)前的場(chǎng)景。部署方案因?yàn)橛螒驗(yàn)橐粋€(gè)網(wǎng)絡(luò)游戲,要多個(gè)玩家同時(shí)參加互動(dòng)。所有程序有服務(wù)器端和客戶端兩部分。它們部署圖如圖4所示:圖4部署圖服務(wù)器端部署服務(wù)器端程序,負(fù)責(zé)保存當(dāng)前玩家的信息,對(duì)客戶端發(fā)過(guò)來(lái)的消息進(jìn)行處理并轉(zhuǎn)發(fā)等??蛻舳酥恍枰渴鹂蛻舳顺绦?,負(fù)責(zé)發(fā)送消息并處理游戲主要邏輯。系統(tǒng)實(shí)現(xiàn)代碼結(jié)構(gòu)圖5代碼結(jié)構(gòu)程序是用eclipse平臺(tái)開(kāi)發(fā),在該平臺(tái)下代碼組織如圖5所示。代碼結(jié)構(gòu)的詳細(xì)介紹參考表1。表1代碼結(jié)構(gòu)介紹文件夾包名稱(chēng)類(lèi)描述Src游戲源代碼net.jeson.game.util(存放系統(tǒng)中經(jīng)常用到的類(lèi),系統(tǒng)級(jí))GameKey.java系統(tǒng)級(jí)參數(shù)Util.java系統(tǒng)級(jí)的類(lèi)net.jeson.game.server(存放服務(wù)器端相關(guān)的類(lèi))Server.java服務(wù)器端的主程序net.jeson.game(存放啟動(dòng)游戲所有到的類(lèi))Game.java啟動(dòng)游戲的入口類(lèi)(存放處理一些業(yè)務(wù)邏輯的類(lèi))Bomb.java管理放置的“泡泡”的類(lèi)Message.java用來(lái)封裝客戶端和服務(wù)器端直接通訊的消息的類(lèi)MessageManager.java管理消息的接收和發(fā)送ponent(存放一些可以被重用的swing組件,主要是用來(lái)UI的設(shè)計(jì))CenterShowDialog.java把窗口顯示的位置在屏幕上居中GameImage.java管理圖片加載創(chuàng)建的類(lèi)ImageButton.java定義一個(gè)圖片按鈕ImageLabel.java定義一個(gè)圖片的label.ImagePanel.java定義一個(gè)圖片的panelnet.jeson.game.ui(游戲主要顯示的界面)Login.java登陸游戲的界面GameHall.java游戲大廳的界面QQFrame.java啟動(dòng)對(duì)戰(zhàn)場(chǎng)景的窗口QQPad.java對(duì)戰(zhàn)場(chǎng)景中的畫(huà)布Images(存放游戲所用到的圖片)Map(存放游戲?qū)?zhàn)場(chǎng)景中的地圖。)公共類(lèi)的介紹系統(tǒng)中定義了一些公共的類(lèi),可以被客戶端和服務(wù)器端多次使用,這些類(lèi)里的方法多是靜態(tài)的。GameKey.java這里定義了一些系統(tǒng)級(jí)的一些參數(shù),都是靜態(tài)的。Util.java主要定義了4個(gè)方法,用戶測(cè)試時(shí)候打印信息的,全屏的,和關(guān)閉顯示窗口的方法。MessageManager.java聲明了發(fā)送消息和接收消息的兩個(gè)方法。控制著客戶端和服務(wù)器端之間的數(shù)據(jù)交換。服務(wù)器端的開(kāi)發(fā)服務(wù)器端開(kāi)發(fā)是使用JAVA語(yǔ)言中的套接字,采用TCP協(xié)議進(jìn)行通訊的。通訊的數(shù)據(jù)全部封裝在一個(gè)Message類(lèi)里面。這些數(shù)據(jù)在網(wǎng)絡(luò)之間傳輸并在客戶端和服務(wù)器端進(jìn)行解析,得到后作出相應(yīng)的動(dòng)作。處理流程參考圖6.圖6服務(wù)器端處理流程服務(wù)器端主要用到了java中的網(wǎng)絡(luò)編程和線程。在構(gòu)造函數(shù)中,利用默認(rèn)端口創(chuàng)建一個(gè)套接字ServerSocket(Port);然后進(jìn)入一個(gè)無(wú)限循環(huán)來(lái)監(jiān)聽(tīng)網(wǎng)絡(luò)連接,每當(dāng)有一個(gè)新的客戶端連接到服務(wù)器,建立一個(gè)新的線程來(lái)處理該客戶請(qǐng)求。之后服務(wù)器端繼續(xù)監(jiān)聽(tīng),等待新的客戶端連接。try{ serversocket=newServerSocket(port); System.out.println("GameServerstartedat:" +serversocket.getInetAddress().getLocalHost()+":" +serversocket.getLocalPort()); while(true){ //設(shè)置玩家的編號(hào):1-8 if(number<8){ number++; }else{ number=0; continue; } clientsocket=serversocket.accept(); System.out.println("Connectionfrom:"+clientsocket); out=newObjectOutputStream(clientsocket.getOutputStream()); ht_out.put(clientsocket,out); ServerThreadserverThread=newServerThread(clientsocket, ht_out,number,out,allMessage); Threadthread=newThread(serverThread); thread.start(); }ServerThread被啟動(dòng)后,也執(zhí)行一個(gè)無(wú)限循環(huán),對(duì)連接通道進(jìn)行監(jiān)聽(tīng),如果有該通道發(fā)過(guò)來(lái)的信息,就對(duì)相關(guān)的信息進(jìn)行處理,之后把處理后的消息轉(zhuǎn)發(fā)給所有玩家??蛻舳耸紫仍诔绦蛑卸x了幾個(gè)通用的組件和方法:CenterShowDialog,GameImage.java,ImageButton.java,ImageLabel.java和ImagePanel.javaCenterShowDialog:這個(gè)類(lèi)的功能是使顯示的圖形界面居中。ImagePanel:定義一個(gè)背景為一個(gè)image的畫(huà)板(panel)GameImage:這里定義了一些對(duì)圖片操作的類(lèi),如創(chuàng)建一個(gè)圖片等。ImageButton:定義一個(gè)圖片按鈕(JButton)ImageLabel:定義一個(gè)圖片的標(biāo)簽這些通用的組件和方法供各個(gè)模塊所公用。一些場(chǎng)景的設(shè)置是在它們的基礎(chǔ)上進(jìn)行搭建的。模塊設(shè)計(jì)如圖7所示,游戲客戶端總體分為4個(gè)大的模塊:游戲入口,登陸,游戲大廳,和對(duì)戰(zhàn)場(chǎng)地??蛻舳丝蛻舳擞螒蛉肟诘顷懹螒虼髲d對(duì)戰(zhàn)場(chǎng)地提示一些版權(quán)信息輸入玩家名稱(chēng),密碼角色選擇,聊天,狀態(tài)改變利用泡泡攻擊對(duì)方圖7客戶端模塊劃分圖以下對(duì)具體模塊的設(shè)計(jì)進(jìn)行詳細(xì)介紹。游戲入口模塊主要類(lèi):Game.java 描述:顯示一個(gè)無(wú)標(biāo)題欄的窗口,提示一些版權(quán)信息,如圖8所示。圖8游戲聲明首先在它的構(gòu)造方法中初始化該JFrame的相關(guān)屬性。在main方法中,先聲明一個(gè)Game類(lèi),創(chuàng)建聲明窗口。之后調(diào)用Util方法中的showWindow()方法,顯示該窗口的動(dòng)態(tài)展開(kāi),產(chǎn)生一個(gè)動(dòng)畫(huà)的效果。窗口將停頓5秒,以便玩家有足夠的時(shí)間來(lái)閱讀相關(guān)內(nèi)容。最后調(diào)用Util方法中的closeWindow()方法來(lái)動(dòng)態(tài)地收縮關(guān)閉該窗口。隨后創(chuàng)建一個(gè)Login類(lèi),并將其顯示,進(jìn)入登錄模塊,同時(shí)隱藏該聲明信息窗口。登陸模塊主要類(lèi):Login.java描述:顯示登陸界面(效果請(qǐng)參考圖9),并處理相關(guān)的鼠標(biāo)動(dòng)作,輸入玩家名稱(chēng),密碼等,登陸后和服務(wù)器建立連接,并發(fā)送信息到服務(wù)器。(因?yàn)椴辉O(shè)計(jì)到數(shù)據(jù)庫(kù),這里并沒(méi)有對(duì)玩家輸入的相關(guān)信息進(jìn)行驗(yàn)證,也沒(méi)有注冊(cè)玩家信息的功能)圖9登陸界面因設(shè)計(jì)到對(duì)一些組件的監(jiān)聽(tīng),并對(duì)鼠標(biāo)事件進(jìn)行監(jiān)聽(tīng),該類(lèi)實(shí)現(xiàn)了相關(guān)方法:publicclassLoginextendsJFrameimplementsActionListener,mouseMotionListener構(gòu)造方法調(diào)用init()方法對(duì)類(lèi)進(jìn)行初始化,這里主要是創(chuàng)建了兩個(gè)ImageButton:login_bt和exit_bt,兩個(gè)文本框:user和password,設(shè)置它們被顯示的位置和樣式,同時(shí)為兩個(gè)ImageButton增加鼠標(biāo)監(jiān)聽(tīng)事件。當(dāng)鼠標(biāo)點(diǎn)擊login_bt時(shí),將觸發(fā)一個(gè)事件,捕捉該事件,并進(jìn)行處理。處理過(guò)程:從user和password兩個(gè)文本框得到玩家輸入的信息,把這些信息作為屬性值賦值給一個(gè)新的Message實(shí)體。創(chuàng)建一個(gè)和服務(wù)器的新的連接,把這個(gè)message發(fā)送到服務(wù)器段。之后創(chuàng)建一個(gè)GameHall:newGameHall(msg,in,out);游戲大廳模塊主要類(lèi):GameHall.java描述:游戲大廳的主界面,同時(shí)負(fù)責(zé)處理玩家一些鼠標(biāo)事件,并和服務(wù)器進(jìn)行通訊,發(fā)送/接受消息。當(dāng)鼠標(biāo)觸發(fā)一些事件時(shí)候,對(duì)事件的內(nèi)容進(jìn)行解析,然后根據(jù)不同的事件,創(chuàng)建不同類(lèi)型的消息,把相關(guān)的必要的信息進(jìn)行封裝,最后發(fā)給服務(wù)器。由服務(wù)器進(jìn)行處理后,服務(wù)器發(fā)送消息給所有客戶端,客戶端接收到消息,并對(duì)接收到的消息進(jìn)行處理,來(lái)改變大廳場(chǎng)景。該類(lèi)中設(shè)計(jì)到對(duì)整個(gè)大廳中鼠標(biāo)和鍵盤(pán)事件的監(jiān)聽(tīng),并創(chuàng)建一個(gè)主的線程來(lái)監(jiān)聽(tīng)從服務(wù)器端發(fā)來(lái)的消息。因此該類(lèi)實(shí)現(xiàn)了MouseListener,MouseMotionListener,Runnable,KeyListener等接口。構(gòu)造方法中調(diào)用了init()方法。初始化大廳用到的一些組件。整個(gè)大廳是一個(gè)ImagePanel,一個(gè)畫(huà)布。所有的組件都是在這個(gè)畫(huà)布上增加。并為這些組件增加一個(gè)監(jiān)聽(tīng)器來(lái)監(jiān)聽(tīng)它們的動(dòng)作。之后程序啟動(dòng)主線程,對(duì)服務(wù)器發(fā)來(lái)的消息進(jìn)行監(jiān)聽(tīng),并在解析后作出相應(yīng)的動(dòng)作。thread=newThread(this);thread.start();當(dāng)受到一個(gè)消息時(shí),根據(jù)消息的類(lèi)型,作出不同的動(dòng)作。最后調(diào)用paint()方法來(lái)刷新主畫(huà)布從而改變場(chǎng)景。調(diào)用paint()方法時(shí),首先把所要玩家都移除,然后重新畫(huà)整個(gè)場(chǎng)景:removeAllPlayer()for(Enumeratione=htPlayer.elements();e.hasMoreElements();){Messagemsg=(Message)e.nextElement();showPlayer(msg);}其中的showPlayer()方發(fā)中是根據(jù)玩家不同的編號(hào)(number)和小組(team)來(lái)把玩家的圖片畫(huà)到畫(huà)布的不同位置。并判斷該玩家現(xiàn)在的準(zhǔn)備情況,如果準(zhǔn)備好了就顯示準(zhǔn)備狀態(tài)。游戲大廳中主要實(shí)現(xiàn)了小組的選擇,聊天功能,準(zhǔn)備和取消準(zhǔn)備等功能。小組的選擇:游戲中的小組分為“藍(lán)隊(duì)”和“紅隊(duì)”,它們的選擇圖標(biāo)都是一個(gè)ImageButton。當(dāng)有鼠標(biāo)點(diǎn)擊它們的動(dòng)作時(shí),將觸發(fā)一個(gè)鼠標(biāo)點(diǎn)擊事件,這時(shí)鼠標(biāo)監(jiān)聽(tīng)器將捕捉到該動(dòng)作。然后創(chuàng)建一個(gè)新的消息,把玩家的一些信息賦值給該消息,同時(shí)設(shè)置消息的類(lèi)別為“更換小組”,最后發(fā)送消息.這里以選擇藍(lán)隊(duì)為例:Messagetest=newMessage();test.team=GameKey.TEAM_BLUE;test.type=GameKey.MESSAGE_TYPE_CHANGE_TEAM;test.number=meMessage.number;test.UserName=meMessage.UserName;Util.printMessage("SelectTeam",test);當(dāng)客戶端收到Type為GameKey.MESSAGE_TYPE_CHANGE_TEAM(數(shù)值為5)的消息時(shí),從保存的所有玩家的信息中得到狀態(tài)改變的該玩家,并更換它的TEAM,之后還放到HashTable中。 for(Enumeratione=htPlayer.elements();e.hasMoreElements();){ Messagetest=(Message)e.nextElement(); if(test.number==msg.number){ test.team=msg.team; htPlayer.put(Integer.toString(test.number),test); } }最后要調(diào)用paint()方法來(lái)重新刷新該畫(huà)布,改變場(chǎng)景,使該玩家的顏色顯示和選擇小組顏色一致。 聊天功能:原理和小組選擇相似,首先玩家在文本框中輸入要發(fā)送的消息內(nèi)容,當(dāng)點(diǎn)擊“發(fā)送”的圖片按鈕時(shí),觸發(fā)一個(gè)鼠標(biāo)動(dòng)作。監(jiān)視器攔截該動(dòng)作,并得到輸入文本框中的信息,把它封裝到一個(gè)消息里面Message。最后發(fā)往服務(wù)器。服務(wù)器端只是把消息進(jìn)行轉(zhuǎn)發(fā)給所有玩家。玩家的客戶端收到消息后,判斷該消息的類(lèi)型,如果是聊天消息,將聊天的內(nèi)容提取,然后顯示在聊天信息板里面。準(zhǔn)備/取消準(zhǔn)備功能:點(diǎn)擊準(zhǔn)備圖片按鈕,觸發(fā)一個(gè)事件,然后封裝生成一個(gè)消息發(fā)送到服務(wù)器,服務(wù)器轉(zhuǎn)發(fā)。客戶端收到消息后把該玩家的狀態(tài)改為“準(zhǔn)備”。之后判斷是否所有玩家都已經(jīng)準(zhǔn)備好,如果都準(zhǔn)備好,把全局變量Ready的數(shù)值設(shè)置為“OK”,然后在主線程里判斷這個(gè)值從而得到是否所有玩家都已經(jīng)準(zhǔn)備好。都準(zhǔn)備好的話就創(chuàng)建一個(gè)新的窗口進(jìn)入對(duì)戰(zhàn)區(qū)。對(duì)戰(zhàn)場(chǎng)地模塊主要類(lèi):QQPad.java描述:這個(gè)類(lèi)為游戲大廳的畫(huà)布,同時(shí)處理對(duì)戰(zhàn)時(shí)的主要邏輯,是整個(gè)游戲的核心。負(fù)責(zé)處理了玩家移動(dòng),泡泡的放置及引爆,障礙物的清除和勝負(fù)判斷等多個(gè)功能。當(dāng)玩家進(jìn)入大廳時(shí),程序首先要初始化場(chǎng)景,包括對(duì)地圖和玩家位置的初始化,并為場(chǎng)景增加監(jiān)聽(tīng)器監(jiān)聽(tīng)玩家鍵盤(pán)和鼠標(biāo)的動(dòng)作,之后啟動(dòng)一個(gè)主線程。該線程負(fù)責(zé)處理玩家的鼠標(biāo)和鍵盤(pán)動(dòng)作,并對(duì)從服務(wù)器端接收到的消息進(jìn)行處理,從而改變當(dāng)前的場(chǎng)景。當(dāng)有一個(gè)小組的全部玩家都被消滅后,就判斷勝負(fù)并顯示結(jié)果,這次對(duì)戰(zhàn)就結(jié)束,返回到游戲大廳。整體流程如圖10所示。圖10對(duì)戰(zhàn)處理流程以下將對(duì)幾個(gè)主要的流程作詳細(xì)的介紹。地圖的生成地圖是每個(gè)游戲必需的一個(gè)元素,地圖主要是生成游戲的場(chǎng)景,然后在畫(huà)布上顯示該場(chǎng)景。在開(kāi)發(fā)很多類(lèi)型的游戲中,地圖系統(tǒng)都需要良好的設(shè)計(jì),直觀的說(shuō),我們需要的地圖系統(tǒng)僅僅是一個(gè)2D數(shù)組,然后用最快的方式將數(shù)組影射到屏幕上。地圖的設(shè)計(jì)方式有很多,大多數(shù)2D游戲是通過(guò)開(kāi)發(fā)的地圖編輯器來(lái)實(shí)現(xiàn)的。而該游戲的設(shè)計(jì)是首先定義一個(gè)地圖文件,這個(gè)地圖文件是用一些0,1等數(shù)字表示一種物體。然后在用流對(duì)該文件進(jìn)行讀取,把內(nèi)容讀取到一個(gè)數(shù)組里面。不同的數(shù)字就會(huì)在場(chǎng)景中顯示出不同的物體。程序中首先在map文件夾下定義好一個(gè)“map1.txt”文件,該文件是由0,1,2三種數(shù)字組成:111110010011111111000210100111110012201010011100010010101001101121101010100002011010101011022010101010220110101010110200001010101121101100101010010001110010102210011111001012000111111110010011111其中,0在場(chǎng)景中顯示的是一個(gè)空地,1顯示的是一個(gè)箱子,2顯示為一個(gè)植物。之后通過(guò)流將數(shù)據(jù)讀取到一個(gè)數(shù)組里面:while(true){ Stringline=reader.readLine(); if(line==null){ reader.close(); break; } //過(guò)濾掉#開(kāi)頭的行 if(!line.startsWith("#")){ line=line.trim(); lines.add(line); width=Math.max(width,line.length()); } }height=lines.size(); //對(duì)數(shù)組賦值 for(inti=0;i<height;i++){ Stringline=(String)lines.get(i); for(intj=0;j<line.length();j++){ intc=(int)line.charAt(j); c=c-48; //把ASC碼轉(zhuǎn)化成數(shù)字 map[j][i]=c; } }根據(jù)初始化好的數(shù)組,對(duì)數(shù)組中每一個(gè)元素的值,將顯示不同的物體,從而實(shí)現(xiàn)地圖的初始化。上例中地圖數(shù)組最終顯示到畫(huà)布中的場(chǎng)景如圖11所示:圖11對(duì)戰(zhàn)場(chǎng)地初始化場(chǎng)景:初始化場(chǎng)景主要是初始化場(chǎng)景中使用到的圖片,玩家的位置,為場(chǎng)景中的相關(guān)組件增加監(jiān)聽(tīng)器等。對(duì)于玩家的位置的初始化,這里先判斷玩家的編號(hào),每個(gè)編號(hào)對(duì)應(yīng)一個(gè)不同的位置。而顯示玩家時(shí),是通過(guò)地圖中的數(shù)據(jù)來(lái)顯示的。每一個(gè)地圖代碼代表不同的玩家狀態(tài)。地圖中的一個(gè)格子是一個(gè)數(shù)據(jù),拿map[m][n]=1322為例,這個(gè)數(shù)據(jù)“1322”它們組成為:小組編號(hào)+當(dāng)前朝向+X軸方向的格子數(shù)+Y軸方向的格子數(shù)。其中小組和朝向的代碼制定如下:玩家的小組:1->藍(lán)隊(duì);2->紅隊(duì)朝向:1->朝北;2->朝東;3->朝南;4->朝西最后根據(jù)該數(shù)值,來(lái)最終決定該玩家的當(dāng)前的狀態(tài),根據(jù)狀態(tài)中的位置朝向等信息,在場(chǎng)景中顯示相應(yīng)的圖片來(lái)創(chuàng)造當(dāng)前狀態(tài)下玩家的實(shí)體。玩家移動(dòng)對(duì)戰(zhàn)過(guò)程處理流程的原理和大廳相似,不過(guò)很多是對(duì)鍵盤(pán)的監(jiān)聽(tīng)。當(dāng)按下鍵盤(pán)的方向鍵的時(shí)候,監(jiān)聽(tīng)器將捕獲該動(dòng)作,然后將該動(dòng)作的信息封裝為一個(gè)消息,在服務(wù)器端再對(duì)消息進(jìn)行轉(zhuǎn)發(fā)給所有玩家。玩家收到消息,對(duì)消息進(jìn)行解析,得用戶的操作,然后改變玩家對(duì)應(yīng)單元格的代碼,之后刷新整個(gè)畫(huà)布,玩家的位置將做出變化。其中在移動(dòng)玩家的時(shí)候,要先判斷前方是否有障礙物或者是否已經(jīng)到達(dá)了邊界,是的話將不能進(jìn)行移動(dòng)。泡泡處理泡泡的顯示也是用一個(gè)數(shù)組坐標(biāo)來(lái)表示,不過(guò)這個(gè)是另外建了一個(gè)新的數(shù)組map2[][],它的大小和場(chǎng)景坐標(biāo)一樣,但是狀態(tài)只有兩種:放置的泡泡和爆炸中的泡泡。當(dāng)玩家按下空格建,將會(huì)把玩家當(dāng)前位置出放置一個(gè)泡泡,即把map2中的對(duì)應(yīng)狀態(tài)改為“8”。放置泡泡的時(shí)候,其實(shí)建立了一個(gè)泡泡的線程,為這個(gè)泡泡設(shè)置位置,然后就啟動(dòng)該線程,當(dāng)停頓4妙后,將把這個(gè)泡泡給引爆。pad.setBomb(m,n); sleep(sleepTime);//sleepTime=4s pad.Bombing(m,n,power); sleep(500); pad.cleanBomb(); sleep(1000); pad.cleanPlayer();引爆時(shí)調(diào)用了Bombing方法。該方法主要是根據(jù)泡泡的威力,把在爆炸范圍內(nèi)的箱子或者玩家給清除。也就是改變坐標(biāo)的代碼。首先要顯示一個(gè)爆炸時(shí)候的圖片,之后清楚相關(guān)的物體。for(inti=m;i<=m+power;i++){//向右 if(i>=15){ break; } if(map[i][n]==2){ break; } if(map[i][n]==0){ map[i][n]=88; } if(map[i][n]==1){ map[i][n]=88; break; } ……}泡泡的爆炸場(chǎng)景顯示持續(xù)半秒后,將把爆炸范圍內(nèi)的物體(植物除外)的值設(shè)置為0,這樣在下次刷新場(chǎng)景時(shí)將清理被炸掉的物體。結(jié)束判斷:在每次泡泡爆炸后,都要進(jìn)行一次判斷,首先要判斷是否有玩家被炸到,如果有就將該玩家的狀態(tài)設(shè)置為’DEAD’,然后判斷整個(gè)小組是否所有成員都已經(jīng)dead掉,如果是,則認(rèn)定該組失敗,而對(duì)方獲勝。游戲結(jié)束。if(myLive==0&&blue_team_alive==true&&red_team_alive==true){ g.drawImage(deathImg,84,140,this); } if(myTeam==1){ if(!blue_team_alive){ g.drawImage(lossImg,84,140,this); } if(!red_team_alive){ g.drawImage(winImg,84,140,this); } } if(myTeam==-1){ if(!red_team_alive){ g.drawImage(lossImg,84,140,this); } if(!blue_team_alive){ g.drawImage(winImg,84,140,this); } }測(cè)試因?yàn)橥耆_(kāi)發(fā)一個(gè)完整的網(wǎng)絡(luò)游戲需要巨大的時(shí)間和精力上的投入,該程序的主要目的是研究泡泡堂游戲的主體開(kāi)發(fā)原理和流程。在開(kāi)發(fā)過(guò)程中還有一些BUG要完善。測(cè)試過(guò)程中主要精力分析數(shù)據(jù)在傳輸過(guò)程中數(shù)據(jù)丟失和對(duì)戰(zhàn)中玩家坐標(biāo)的調(diào)整上。為了最大可能的增加系統(tǒng)的穩(wěn)定性,曾大范圍的改變了游戲的設(shè)計(jì)思想,爭(zhēng)取做到最優(yōu)。通過(guò)測(cè)試,整個(gè)游戲能夠很好的完成整個(gè)操作流程。并可以實(shí)現(xiàn)多人登陸,在游戲大廳進(jìn)行信息交換,和在對(duì)戰(zhàn)場(chǎng)地進(jìn)行對(duì)戰(zhàn)等功
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國(guó)汽車(chē)起動(dòng)/充電/電焊多用機(jī)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)基因診斷試劑盒數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)五聯(lián)單控開(kāi)關(guān)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025年度高端礦泉水品牌戰(zhàn)略合作供貨協(xié)議合同4篇
- 二零二五版智能倉(cāng)儲(chǔ)物流系統(tǒng)合同范本4篇
- 2025年出租車(chē)司機(jī)職業(yè)發(fā)展與教育培訓(xùn)合同3篇
- 2025年度住宅裝修環(huán)保材料采購(gòu)與施工合同
- 2025年度個(gè)人醫(yī)療借款擔(dān)保合同模板2篇
- 二零二五年度文化交流慈善捐贈(zèng)合作協(xié)議樣本4篇
- 2025年度彩鋼板房拆除與建筑廢棄物資源化利用與環(huán)保評(píng)估協(xié)議3篇
- 廣東省茂名市電白區(qū)2024-2025學(xué)年七年級(jí)上學(xué)期期末質(zhì)量監(jiān)測(cè)生物學(xué)試卷(含答案)
- 2024版?zhèn)€人私有房屋購(gòu)買(mǎi)合同
- 2024爆炸物運(yùn)輸安全保障協(xié)議版B版
- 2025年度軍人軍事秘密保護(hù)保密協(xié)議與信息安全風(fēng)險(xiǎn)評(píng)估合同3篇
- 《食品與食品》課件
- 讀書(shū)分享會(huì)《白夜行》
- 光伏工程施工組織設(shè)計(jì)
- DB4101-T 121-2024 類(lèi)家庭社會(huì)工作服務(wù)規(guī)范
- 化學(xué)纖維的鑒別與測(cè)試方法考核試卷
- 2024-2025學(xué)年全國(guó)中學(xué)生天文知識(shí)競(jìng)賽考試題庫(kù)(含答案)
- 自動(dòng)駕駛汽車(chē)道路交通安全性探討研究論文
評(píng)論
0/150
提交評(píng)論