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