基于Java的简单2DRPG游戏系统设计
来源:用户上传
作者:
摘 要:近年来游戏的发展十分迅速,中国成为了全球最大的游戏市场,而且游戏行业的整体收入还在不断增长。2D像素风RPG游戏在二三十年前曾经红极一时,凭借自身的特点,在今天也得到了很多人的喜爱。而Java具有很多特性,用Java开发的软件可以方便地移植到不同的平台上。而游戏玩家使用的操作系统并不统一,为了方便游戏在各种系统下的稳定运行,所以采用了Java进行编码。
关键词:Java RPG 游戏 swing 脚本
中图分类号:TP311 文献标识码:A 文章编号:1672-3791(2019)03(c)-0021-02
1 游戏系统结构
该游戏系统使用Java的swing来建立GUI界面。除此之外,它的系统中包括了碰撞检测、画面渲染、音效、脚本处理、文件I/O等部分。利用swing的事件监听来接收玩家的操作。碰撞检测用来限制玩家的移动范围。画面渲染部分将多个图层以及特效绘制在屏幕上。在事件触发时由音效部分来播放各种音乐。脚本处理用来处理提取编写好的游戏脚本,引导游戏发展。文件I/O部分用于游戏从本地加载数据或保存数据。
2 图形界面
当程序开始运行后首先加载本地的各种配置文件,如果配置文件正常,就会通过配置中的信息来创建窗口,通过用窗口监听AWT事件来接收所有玩家的控制,并根据具体的事件类型进行反馈。
窗口在创建后会创建多个panel,分别用来显示游戏中不同的界面。当游戏需要进行页面切换时只需要调整这些panel之间的可视性即可。各个面板在被显示的时候都会执行响应的操作,存取档的panel在被显示的时候会加载本地的存档索引。设置界面的panel在被显示的时候会根据当前的设置显示对应的数据。游戏界面的panel在被显示的时候会实例化一个线程用于游戏的主循环。
2.1 双缓冲刷新画面
由于游戏画面分为多个图层,而且人物之间也有可能出现覆盖,如果将每个图像直接刷新在屏幕上可能会造成游戏画面的闪烁。为了防止这种情况出现,系统会将所有需要刷新的画面提前处理。将这些图像先在内存中绘制到一张图上,等到游戏下一帧刷新时再一次性刷新到屏幕,这样可以有效提高画面质量。
2.2 循环渲染延时
游戏画面的渲染放在了游戏的主循环中,每次循环更新过游戏数据后,渲染模块才会根据最新的数据进行游戏画面的渲染,并进行响应的延时。
系统默认画面帧数为60帧,也就是说理想情况下每帧应该用时16.67ms。每帧渲染后延时模块会用1/60减去本帧从开始到结束所用的时间和上一帧多耗费的纳秒时间,得到本帧应该延时的时间。如果本帧超过了自己应该用的时间就放弃本次延时。当放弃达到某一数量就让自己的CPU使用时间一次。
3 数据文件
游戏中需要用到很多的本地文件,或者有些信息必须从本地加载,为了统一加载这些数据,每种都有其对应的数据文件。
3.1 地图配置文件
一张地图有时会有多个图层,可能会有对应的BGM,地图中的某些位置可能无法移动,也可能会触发某些事件。这些信息就需要记录在地图的配置文件当中。配置文件包含地图的宽高、地图图片的地址、地图对应的事件二维数组、地图中自动触发事件的编号,以及可以行走的区域编号、地图默认的BGM编号。
所有地图配置文件的地址存在一个地图配置索引文件中,这个文件在程序初始化阶段被加载。
3.2 角色配置文件
每个角色都有自己对应的立绘、id、名字等数据,这些数据被保存在角色配置文件中,此文件包含所有角色的名字、立绘地址、行走图地址,以数据的顺序作为角色的id。此文件在程序初始化时被加载,并且根据其中信息在程序中实例化角色的对象。
3.3 脚本文件
每张地图中都会有很多个事件,每个事件都对应着一个脚本文件,在玩家触发此事件的时候,脚本解释器就会根据所处的地图,到本地图对应的脚本文件夹下加载对应的脚本文件,解释器对脚本中每条命令进行顺序执行。
3.4 存档文件
游戏中事件触发的顺序,每个事件需要实行的步骤都被保存在一个数组中。游戏中玩家对物品的拥有情况只分为有或没有,为了节省空间使用压位法将数据保存在一个64位的长整形中。
在玩家进行存档操作时,系统会将保存事件进度的数组、保存物品有无的长整型、当前玩家所在地图编号、玩家在当前地图的坐标这几个数据输出到本地的存档文件。
当需要继续游戏时,系统只需要读取本地的存档数据,再跟进存档加载其他文件就可以继续游戏。
3.5 事件索引文件
为了方便维护和修改,每张地图中的脚本编号都是重新开始的,这样避免了想在靠前的地图中加入新脚本时需要把所有后面的脚本编号后移的问题。
事件索引文件中记录的是每个地图中一共有多少事件,脚本系统会根据这个文件来为各个事件分配id。这样某个脚本在需要修改其他事件进度的时候,就可以地图编号和事件编号得到那个事件的id。
4 脚本系统
系统采用了自主设计的脚本格式和对应的脚本解释模塊。将所有事件根据地图顺序进行统一编号。将每一个事件对应到一个独立的脚本文件。把每个事件可能对应的不同情况以分步的方式写在事件对应的脚本文件中,解释器会根据玩家的操作、其他事件完成情况、玩家的状态等来选择对应的步骤执行。 通过这种脚本命令可以实现以下功能:
(1)控制显示,切换或取消图片、特效、对话、表情;(2)在没有玩家控制的情况下移动人物;(3)播放各种音效;(4)切换地图;(5)修改各个事件的完成度;(6)显示选择框来让玩家做判断。
通过这些功能,基本可以满足游戏的叙事和过场表演的效果。
事件触发后,解释器会首先判断当前玩家是否满足此事件的触发要求,如果满足就开始按行读取并执行脚本。
脚本命令大致分为两类。
需要玩家響应的:解释器在读取到这一行命令时就会进入循环判断玩家是否有做出一些响应。只有在有响应时才会执行这一行命令。否则会一直等待玩家的响应。
不需要玩家响应的:解释器在读取到这一行命令的时候会进行一些与本命令有关的条件判断,如果满足就直接执行,不等待玩家的响应。
5 玩家控制
系统通过对AWT事件的监听处理来获取玩家的控制输入。在主循环中每次更新游戏时会根据读取到的控制信息来更新系统中各个对象的状态。
游戏中的角色在系统中被抽象为一个矩形,在角色移动的时候,系统会以这个矩形的四边和地图对应的事件数组为基础,对角色的移动进行碰撞检测。如果下一次移动角色会进入不能进入的区域,系统将会把角色的位置信息更新为紧贴着区域边界,以防止角色越界。
6 结语
该游戏系统通过Java代码实现了以上部分,完成了作为一个简单RPG游戏系统所需要的基本功能。通过对这些部分的组合运用,可以实现很多游戏效果。其中大部分模块都可以单独作为组件,只需要给它对应的配置文件,就可以在其他代码中复用。但是在某些地方还存在着一些缺陷,比如渲染延时会使游戏内时间收到影响、画面渲染时前后两帧可能浪费了时间因为大部分区域没有发生变化等。这些问题还需要进行优化。
参考文献
[1] 邱仲潘.Java游戏编程[M].北京:科学出版社,2004:32.
[2] 赵满来.可视化Java GUI程序设计教程——基于Swing组件库及NetBeans IDE[M].北京:清华大学出版社,2015.
[3] Gregory J,叶劲峰.游戏引擎架构[M].北京:电子工业出版社,2014:277-356.
转载注明来源:https://www.xzbu.com/8/view-14874954.htm