呂艷陽(yáng)
摘要:在程序設(shè)計(jì)課程中,學(xué)生普遍認(rèn)為多人聯(lián)機(jī)對(duì)戰(zhàn)游戲制作難度大,一般選擇休閑小游戲作為綜合實(shí)踐項(xiàng)目。制作一款包含客戶(hù)端、服務(wù)端的多人聯(lián)機(jī)對(duì)戰(zhàn)游戲,可以綜合應(yīng)用各種程序設(shè)計(jì)技術(shù)、網(wǎng)絡(luò)編程技術(shù)以及設(shè)計(jì)模式,提高學(xué)生專(zhuān)業(yè)實(shí)踐能力。
關(guān)鍵詞:多人聯(lián)機(jī); 游戲; 網(wǎng)絡(luò)編程; 設(shè)計(jì)模式; 客戶(hù)端; 服務(wù)端
中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2017)34-0081-03
Abstract: In the program design course, the students are generally believed that Multiplayer Online Battle Game is difficult to develop, usually choose little recreational game as comprehensive practical project. Make a Multiplayer Online Battle Game including client and server, can practice various technology, such as programming technology, network technology and design patterns, to improve students' professional practical ability.
Key words: Multiplayer Online; Game; network programming; design patterns; client; server
1 概述
騰訊運(yùn)營(yíng)的多人對(duì)戰(zhàn)游戲,取得了巨大的市場(chǎng)成功。這款游戲是一個(gè)典型的C/S結(jié)構(gòu)的網(wǎng)絡(luò)游戲,包含客戶(hù)端部分和服務(wù)端部分。在教學(xué)工作中,把這樣的題目作為綜合實(shí)踐項(xiàng)目,多數(shù)學(xué)生都覺(jué)得制作難度大,一般會(huì)選擇休閑小游戲。
即使學(xué)生學(xué)習(xí)了程序設(shè)計(jì)、socket網(wǎng)絡(luò)編程、設(shè)計(jì)模式等課程,學(xué)生很難綜合應(yīng)用各門(mén)專(zhuān)業(yè)課程,制作一款多個(gè)用戶(hù)聯(lián)機(jī)、對(duì)戰(zhàn)競(jìng)技、包含服務(wù)端、客戶(hù)端的對(duì)戰(zhàn)游戲。
該游戲的開(kāi)發(fā),綜合使用了MVC架構(gòu)、多線程、socket網(wǎng)絡(luò)編程和消息處理、設(shè)計(jì)模式等技術(shù),程序耦合較低,架構(gòu)良好,實(shí)現(xiàn)了多人聯(lián)機(jī)對(duì)戰(zhàn)的主要流程和功能。
2 游戲結(jié)構(gòu)
該游戲使用MVC架構(gòu)、JAVA語(yǔ)言制作,不依賴(lài)第三方引擎,適合課程教學(xué)。游戲主要功能:
服務(wù)端:在一臺(tái)計(jì)算機(jī)上運(yùn)行服務(wù)端程序。服務(wù)端負(fù)責(zé)接收消息,轉(zhuǎn)發(fā)消息,讓各個(gè)客戶(hù)端的事件同步,從而畫(huà)面同步。
客戶(hù)端:開(kāi)啟8臺(tái)電腦,運(yùn)行客戶(hù)端。每人控制一名英雄角色,點(diǎn)擊鼠標(biāo)移動(dòng),按Q、W鍵使用攻擊技能、補(bǔ)血技能。
勝負(fù)規(guī)則:雙方陣營(yíng)各4人,每方有一個(gè)防御塔,摧毀對(duì)方塔則獲勝。實(shí)際部署效果如圖1、圖2所示。
游戲作為一種軟件,完全符合MVC(Model View Control)架構(gòu)。M負(fù)責(zé)數(shù)據(jù)存儲(chǔ),圖片資源素材;V負(fù)責(zé)視圖顯示、圖片繪制;C負(fù)責(zé)程序控制,刷新各項(xiàng)數(shù)據(jù)。良好的程序架構(gòu),就是這三部分分工協(xié)作。
3 客戶(hù)端功能和類(lèi)結(jié)構(gòu)
3.1 總體結(jié)構(gòu)
游戲效果如圖3所示:
客戶(hù)端總體程序、事件關(guān)系如圖4所示:
程序主要包括以下類(lèi):
紅方列表HeroArray類(lèi):存放紅方英雄和塔。
藍(lán)方列表EnemyArray類(lèi):存放藍(lán)方英雄和塔。
技能類(lèi)SkillArray類(lèi),定義兩個(gè)對(duì)象,存放雙方陣營(yíng)發(fā)出的技能,包括攻擊技能和補(bǔ)血技能。
程序的底層組件,包括圖片類(lèi)、移動(dòng)類(lèi)、動(dòng)畫(huà)類(lèi)、技能類(lèi)。將單個(gè)組件封裝,能存放、管理多個(gè)對(duì)象的類(lèi),包括圖片數(shù)組類(lèi),技能數(shù)組類(lèi),動(dòng)畫(huà)數(shù)組類(lèi)。
3.2 可移動(dòng)的圖片
可移動(dòng)的圖片(ItemPathBase類(lèi)),由兩個(gè)類(lèi)組合而成,圖片類(lèi)ItemBase和移動(dòng)類(lèi)Path,類(lèi)圖如圖5所示。
圖片類(lèi)ItemBase:包含一個(gè)玩家單位的基本數(shù)據(jù)和素材圖片(java的Image類(lèi))。
移動(dòng)類(lèi)Path:包含一次移動(dòng)的基本數(shù)據(jù),例如起始/結(jié)束坐標(biāo)、方向向量等。由父類(lèi)Path保存公共的數(shù)據(jù),Path的子類(lèi)實(shí)現(xiàn)不同的移動(dòng)方式:A點(diǎn)到B點(diǎn), A點(diǎn)朝B點(diǎn)方向移動(dòng)。
一個(gè)英雄角色,一個(gè)發(fā)出的子彈,一個(gè)塔,都是使用ItemPathBase類(lèi)。
3.3 動(dòng)畫(huà)
動(dòng)畫(huà)由多幅圖片組成,依次繪制到屏幕上。
單個(gè)動(dòng)畫(huà)的類(lèi)AniBm:
屬性:Imgae對(duì)象,對(duì)應(yīng)一個(gè)圖片文件;動(dòng)畫(huà)狀態(tài),準(zhǔn)備/播放/結(jié)束。
方法:繪制圖片,當(dāng)前幀加1,設(shè)置輸出坐標(biāo)。
一次補(bǔ)血技能的動(dòng)畫(huà),就是使用AniBm類(lèi)。
用列表存放多個(gè)動(dòng)畫(huà),并實(shí)現(xiàn)動(dòng)畫(huà)的添加、刪除、刷新,就是多個(gè)動(dòng)畫(huà)的類(lèi)AniBmArray。
動(dòng)畫(huà)的類(lèi)圖如圖6所示:
3.4 多個(gè)英雄角色
把多個(gè)游戲單位以及碰撞檢測(cè),封裝成一個(gè)類(lèi)ItemArrayBase類(lèi)。多個(gè)英雄、塔,都使用這個(gè)類(lèi)。
屬性:列表ArrayList
方法:繪制人物圖片的函數(shù),繪制生命條,碰撞檢測(cè),如果碰到敵方技能,該英雄減少血量。一方塔被摧毀,則對(duì)方獲勝。
用戶(hù)控制的單位是列表中的某一個(gè)元素。不同客戶(hù)端,操縱不同英雄角色,實(shí)現(xiàn)了多人對(duì)戰(zhàn)。
3.5 移動(dòng)功能
當(dāng)點(diǎn)擊鼠標(biāo),設(shè)置玩家控制單位的目的地坐標(biāo),開(kāi)始移動(dòng)。通過(guò)游戲循環(huán),不斷地刷新坐標(biāo),實(shí)現(xiàn)移動(dòng)功能。
移動(dòng)類(lèi)Path類(lèi),用一個(gè)整數(shù)表示當(dāng)前狀態(tài),狀態(tài)集合包括停、走兩種狀態(tài):
public static int READY=1;
public static int MOVE=2;
狀態(tài)改變過(guò)程:
1) 設(shè)置目的地坐標(biāo)后,狀態(tài)設(shè)置為MOVE,表示開(kāi)始走;
2) 如果狀態(tài)是MOVE,刷新坐標(biāo)數(shù)據(jù);
3) 如果到達(dá)目的地,狀態(tài)設(shè)置為READY,表示一次移動(dòng)結(jié)束。
3.5 攻擊技能、補(bǔ)血技能
基本的父類(lèi)包含公共數(shù)據(jù)、技能狀態(tài),子類(lèi)實(shí)現(xiàn)不同技能。
1) 技能的父類(lèi)SkillBase類(lèi):
屬性:技能狀態(tài),準(zhǔn)備/發(fā)出/結(jié)束;
方法:繪制,啟動(dòng)技能,刷新數(shù)據(jù),是否進(jìn)行碰撞檢測(cè)。
2) 子類(lèi),攻擊技能SkillBullet類(lèi):
屬性:一個(gè)可移動(dòng)的子彈圖片
方法:繪制子彈;刷新子彈坐標(biāo);需要碰撞檢測(cè)。
3) 子類(lèi),補(bǔ)血技能SkillAddHp類(lèi):
屬性:圖片數(shù)組,存放一段動(dòng)畫(huà)素材;
方法:繪制動(dòng)畫(huà);刷新動(dòng)畫(huà)幀;不需要碰撞檢測(cè)。
類(lèi)圖如圖7所示:
4 服務(wù)端功能和類(lèi)結(jié)構(gòu)
4.1 多種設(shè)計(jì)方案
某方案A:服務(wù)端實(shí)現(xiàn)業(yè)務(wù)邏輯功能,不斷地發(fā)送各個(gè)畫(huà)面。這樣的數(shù)據(jù)量太大,對(duì)于對(duì)戰(zhàn)游戲,會(huì)有延遲。
某方案B:實(shí)時(shí)地發(fā)送所有游戲角色的坐標(biāo)、屬性數(shù)據(jù),客戶(hù)端收到數(shù)據(jù)后,繪制一幅畫(huà)面。這樣發(fā)送的數(shù)據(jù)量大,發(fā)送次數(shù)多。
該游戲服務(wù)端的實(shí)現(xiàn)方案:使用socket網(wǎng)絡(luò)編程,轉(zhuǎn)發(fā)事件消息。
具體過(guò)程:
當(dāng)用戶(hù)觸發(fā)一個(gè)事件,例如玩家移動(dòng)、發(fā)出技能Q或者W,以字符串形式,打包成一條消息。
服務(wù)端接收消息,轉(zhuǎn)發(fā)給其他客戶(hù)端??蛻?hù)端解析消息,完成對(duì)應(yīng)操作,實(shí)現(xiàn)事件同步,從而畫(huà)面同步。
服務(wù)端界面,只有一個(gè)文本框,顯示網(wǎng)絡(luò)消息。如圖8所示:
4.2 服務(wù)端監(jiān)聽(tīng)客戶(hù)端連接
服務(wù)端設(shè)置端口號(hào),建立ServerSocket后,采用多線程技術(shù),每成功連接一個(gè)客戶(hù)端,開(kāi)啟一個(gè)新線程類(lèi)ClientObserverThread類(lèi)。
4.3 事件消息轉(zhuǎn)發(fā)
使用設(shè)計(jì)模式的觀察者模式。每個(gè)監(jiān)聽(tīng)線程作為觀察者,收到消息后,轉(zhuǎn)發(fā)給其他觀察者。類(lèi)圖如圖9所示:
主題類(lèi)Subject類(lèi):
用ArrayList
觀察者ClientObserverThread類(lèi):
主要方法:
1) run函數(shù):用循環(huán)不斷地接收消息。
2) update函數(shù):調(diào)用send發(fā)送消息,作為觀察者模式的觀察者接口。
5 網(wǎng)絡(luò)消息
客戶(hù)端產(chǎn)生的消息采用逗號(hào)分隔的字符串。消息如表1所示:
6 結(jié)束語(yǔ)
充分利用設(shè)計(jì)模式,使程序架構(gòu)良好,可以在程序較少改動(dòng)的情況下,補(bǔ)充新功能。當(dāng)設(shè)置好客戶(hù)端的消息格式,服務(wù)端和客戶(hù)端可以分別改進(jìn)優(yōu)化,互不影響,有利于學(xué)生團(tuán)隊(duì)分工協(xié)作。
多人聯(lián)機(jī)對(duì)戰(zhàn)游戲的開(kāi)發(fā),使學(xué)生知道,綜合利用所學(xué)課程,可以設(shè)計(jì)實(shí)現(xiàn)商業(yè)級(jí)游戲的流程和功能。通過(guò)實(shí)戰(zhàn)鍛煉,改善程序架構(gòu),提高專(zhuān)業(yè)技術(shù)能力。
參考文獻(xiàn):
[1] 楊衛(wèi)紅.坦克大戰(zhàn)游戲設(shè)計(jì)實(shí)例[J].電腦知識(shí)與技術(shù),2016,12(16):215-216.
[2] 電腦編程技巧與維護(hù)雜志社.《電腦編程技巧與維護(hù)》合訂本[J].電腦編程技巧與維護(hù),2011(8).
[3] 相潔,呼克佑.Java語(yǔ)言程序設(shè)計(jì)[M].北京:人民郵電出版社,2013.
[4] 陳銳,夏敏捷,葛麗萍.java游戲編程原理與實(shí)踐教程[M].北京:人民郵電出版社,2013.
[5] 李源.Java程序設(shè)計(jì)經(jīng)典300例[M].北京:電子工業(yè)出版社,2013.