标题 | 多人联机对战游戏的设计与实现 |
范文 | 吕艳阳 摘要:在程序设计课程中,学生普遍认为多人联机对战游戏制作难度大,一般选择休闲小游戏作为综合实践项目。制作一款包含客户端、服务端的多人联机对战游戏,可以综合应用各种程序设计技术、网络编程技术以及设计模式,提高学生专业实践能力。 关键词:多人联机; 游戏; 网络编程; 设计模式; 客户端; 服务端 中图分类号: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.
|
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。