多人联机对战游戏的设计与实现

2018-01-09 14:45吕艳阳
电脑知识与技术 2017年34期
关键词:设计模式服务端客户端

吕艳阳

摘要:在程序设计课程中,学生普遍认为多人联机对战游戏制作难度大,一般选择休闲小游戏作为综合实践项目。制作一款包含客户端、服务端的多人联机对战游戏,可以综合应用各种程序设计技术、网络编程技术以及设计模式,提高学生专业实践能力。

关键词:多人联机; 游戏; 网络编程; 设计模式; 客户端; 服务端

中图分类号: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 存放多个监听线程。转发消息时,调用某个观察者的update函数。

观察者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.

猜你喜欢
设计模式服务端客户端
“1+1”作业设计模式的实践探索
三维协同设计模式下的航天项目管理实践与展望
交通机电工程设计模式创新探讨
云存储中基于相似性的客户-服务端双端数据去重方法
县级台在突发事件报道中如何应用手机客户端
孵化垂直频道:新闻客户端新策略
基于Vanconnect的智能家居瘦客户端的设计与实现
新时期《移动Web服务端开发》课程教学改革的研究
在Windows Server 2008上创建应用
互动式设计模式研究