吕艳阳
摘要:在程序设计课程中,学生普遍认为多人联机对战游戏制作难度大,一般选择休闲小游戏作为综合实践项目。制作一款包含客户端、服务端的多人联机对战游戏,可以综合应用各种程序设计技术、网络编程技术以及设计模式,提高学生专业实践能力。
关键词:多人联机; 游戏; 网络编程; 设计模式; 客户端; 服务端
中图分类号: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 概述
腾讯运营的多人对战游戏,取得了巨大的市场成功。这款游戏是一个典型的C/S结构的网络游戏,包含客户端部分和服务端部分。在教学工作中,把这样的题目作为综合实践项目,多数学生都觉得制作难度大,一般会选择休闲小游戏。
即使学生学习了程序设计、socket网络编程、设计模式等课程,学生很难综合应用各门专业课程,制作一款多个用户联机、对战竞技、包含服务端、客户端的对战游戏。
该游戏的开发,综合使用了MVC架构、多线程、socket网络编程和消息处理、设计模式等技术,程序耦合較低,架构良好,实现了多人联机对战的主要流程和功能。
2 游戏结构
该游戏使用MVC架构、JAVA语言制作,不依赖第三方引擎,适合课程教学。游戏主要功能:
服务端:在一台计算机上运行服务端程序。服务端负责接收消息,转发消息,让各个客户端的事件同步,从而画面同步。
客户端:开启8台电脑,运行客户端。每人控制一名英雄角色,点击鼠标移动,按Q、W键使用攻击技能、补血技能。
胜负规则:双方阵营各4人,每方有一个防御塔,摧毁对方塔则获胜。实际部署效果如图1、图2所示。
游戏作为一种软件,完全符合MVC(Model View Control)架构。M负责数据存储,图片资源素材;V负责视图显示、图片绘制;C负责程序控制,刷新各项数据。良好的程序架构,就是这三部分分工协作。
3 客户端功能和类结构
3.1 总体结构
游戏效果如图3所示:
客户端总体程序、事件关系如图4所示:
程序主要包括以下类:
红方列表HeroArray类:存放红方英雄和塔。
蓝方列表EnemyArray类:存放蓝方英雄和塔。
技能类SkillArray类,定义两个对象,存放双方阵营发出的技能,包括攻击技能和补血技能。
程序的底层组件,包括图片类、移动类、动画类、技能类。将单个组件封装,能存放、管理多个对象的类,包括图片数组类,技能数组类,动画数组类。
3.2 可移动的图片
可移动的图片(ItemPathBase类),由两个类组合而成,图片类ItemBase和移动类Path,类图如图5所示。
图片类ItemBase:包含一个玩家单位的基本数据和素材图片(java的Image类)。
移动类Path:包含一次移动的基本数据,例如起始/结束坐标、方向向量等。由父类Path保存公共的数据,Path的子类实现不同的移动方式:A点到B点, A点朝B点方向移动。
一个英雄角色,一个发出的子弹,一个塔,都是使用ItemPathBase类。
3.3 动画
动画由多幅图片组成,依次绘制到屏幕上。
单个动画的类AniBm:
属性:Imgae对象,对应一个图片文件;动画状态,准备/播放/结束。
方法:绘制图片,当前帧加1,设置输出坐标。
一次补血技能的动画,就是使用AniBm类。
用列表存放多个动画,并实现动画的添加、删除、刷新,就是多个动画的类AniBmArray。
动画的类图如图6所示:
3.4 多个英雄角色
把多个游戏单位以及碰撞检测,封装成一个类ItemArrayBase类。多个英雄、塔,都使用这个类。
属性:列表ArrayList
方法:绘制人物图片的函数,绘制生命条,碰撞检测,如果碰到敌方技能,该英雄减少血量。一方塔被摧毁,则对方获胜。
用户控制的单位是列表中的某一个元素。不同客户端,操纵不同英雄角色,实现了多人对战。
3.5 移动功能
当点击鼠标,设置玩家控制单位的目的地坐标,开始移动。通过游戏循环,不断地刷新坐标,实现移动功能。
移动类Path类,用一个整数表示当前状态,状态集合包括停、走两种状态:
public static int READY=1;
public static int MOVE=2;
状态改变过程:
1) 设置目的地坐标后,状态设置为MOVE,表示开始走;
2) 如果状态是MOVE,刷新坐标数据;
3) 如果到达目的地,状态设置为READY,表示一次移动结束。
3.5 攻击技能、补血技能
基本的父类包含公共数据、技能状态,子类实现不同技能。
1) 技能的父类SkillBase类:
属性:技能状态,准备/发出/结束;
方法:绘制,启动技能,刷新数据,是否进行碰撞检测。
2) 子类,攻击技能SkillBullet类:
属性:一个可移动的子弹图片
方法:绘制子弹;刷新子弹坐标;需要碰撞检测。
3) 子类,补血技能SkillAddHp类:
属性:图片数组,存放一段动画素材;
方法:绘制动画;刷新动画帧;不需要碰撞检测。
类图如图7所示:
4 服务端功能和类结构
4.1 多种设计方案
某方案A:服务端实现业务逻辑功能,不断地发送各个画面。这样的数据量太大,对于对战游戏,会有延迟。
某方案B:实时地发送所有游戏角色的坐标、属性数据,客户端收到数据后,绘制一幅画面。这样发送的数据量大,发送次数多。
该游戏服务端的实现方案:使用socket网络编程,转发事件消息。
具体过程:
当用户触发一个事件,例如玩家移动、发出技能Q或者W,以字符串形式,打包成一条消息。
服务端接收消息,转发给其他客户端。客户端解析消息,完成对应操作,实现事件同步,从而画面同步。
服务端界面,只有一个文本框,显示网络消息。如图8所示:
4.2 服务端监听客户端连接
服务端设置端口号,建立ServerSocket后,采用多线程技术,每成功连接一个客户端,开启一个新线程类ClientObserverThread类。
4.3 事件消息转发
使用设计模式的观察者模式。每个监听线程作为观察者,收到消息后,转发给其他观察者。类图如图9所示:
主题类Subject类:
用ArrayList
观察者ClientObserverThread类:
主要方法:
1) run函数:用循环不断地接收消息。
2) update函数:调用send发送消息,作为观察者模式的观察者接口。
5 网络消息
客户端产生的消息采用逗号分隔的字符串。消息如表1所示:
6 结束语
充分利用设计模式,使程序架构良好,可以在程序較少改动的情况下,补充新功能。当设置好客户端的消息格式,服务端和客户端可以分别改进优化,互不影响,有利于学生团队分工协作。
多人联机对战游戏的开发,使学生知道,综合利用所学课程,可以设计实现商业级游戏的流程和功能。通过实战锻炼,改善程序架构,提高专业技术能力。
参考文献:
[1] 杨卫红.坦克大战游戏设计实例[J].电脑知识与技术,2016,12(16):215-216.
[2] 电脑编程技巧与维护杂志社.《电脑编程技巧与维护》合订本[J].电脑编程技巧与维护,2011(8).
[3] 相洁,呼克佑.Java语言程序设计[M].北京:人民邮电出版社,2013.
[4] 陈锐,夏敏捷,葛丽萍.java游戏编程原理与实践教程[M].北京:人民邮电出版社,2013.
[5] 李源.Java程序设计经典300例[M].北京:电子工业出版社,2013.