Designed By 计算机科学与技术系 171860524 李思勉 2021.1.4
- 大场景,多元素的地图
- 清晰的UI
- 32种不同机制的技能,策略搭配
- 无需配置IP,自动局域网搜索
- 无需WASD,依靠鼠标智能寻路
- 华丽丰富的技能特效
- 丰富的伤害机制
- 长达2900行的代码逻辑,内容丰富
- 敌人血量与魔法值显示在左上角
- 选中可操纵人物的技能,属性,血量等等显示在下方
- 每回合可移动的距离高亮显示在地图中,技能可达范围同样如此
- 左侧一长条的空白处是显示战斗信息的,例如:“大娃使用了大荒星陨,效果拔群!”
6v2回合制不对称竞技,人妖分立在地图两侧,战场**为各种障碍物,丰富了游戏策略性
每名人物拥有武力、智力、护甲、魔抗、速度和攻击范围共计六项属性,技能也分为物理伤害与魔法伤害,此外,游戏过程中友方或敌方会对自己施加buff从而改变属性,机智的利用各项属性去击败对手是一个不错的策略,比如蛇妖的魔抗很高,护甲却很低,应该利用物理伤害型技能对其造成伤害。
六个葫芦娃与两名妖怪共计8个人物,每名人物都拥有普通攻击,防御姿态两个共同技能,外加两个人物的特殊技能,共计32个技能,每回合人物都可以使用四个技能中的一个,因此人物之间各种技能配合不同可能对战局影像极大!下面拿出几个例子展示:
- 普通攻击,造成基于武力值的物理伤害
- 防御姿态,减少接下来受到的所有伤害
- 大荒星陨,牺牲自己的技能,位移致目标位置,并对周围一格的敌人造成大量伤害
4.伪·罗玄剑,射程及其远的技能
此外还有32个技能限于篇幅就不一一介绍了,到游戏中体验吧。
除去技能机制复杂,特效同样如此!这里只列出四个,其余还有很多很多,游戏中体验吧
- 寸劲·开天 特效
- 炎爆术 特效
受够了WASD的操作了吗?本游戏支持自动寻路,只需鼠标点击目标位置,人物就会自动选择一条最短路走过去,太棒了!
自动搜索同一局域网下的游戏玩家,不用再繁杂的输入IP啦!当然,可能由于虚拟机等问题造成搜索不到,也可以人工输入主机IP来匹配。
拒绝闪现式移动,人物拥有四个方向的移动动作
游玩一次结束后会依据胜负不同显示不同的画面:
失败画面:
之后点击该画面即可回到主菜单,可以自由选择重开一局或者是加载回放。
使用JUNIT单元测试,对角色加载,角色移动,角色使用技能等多种逻辑进行了测试
-
从github下载源码与存档文件
-
编译环境要求:jdk14+,maven
-
按编译环境要求编译即可
-
等待编译完成,出现target文件夹
-
再次强调必须将JAVA_HOME设为jdk14+版本
-
双击target文件夹中的UHLW-2.0.jar,程序将会运行;若运行失败,可尝试命令行运行
cd target
java -jar UHLW-2.0.jar
-
出现以下界面即为运行成功
-
可以在一台电脑上同时操作对战双方,也可以使用处在同一局域网(同时连接同一个热点或路由器,即要求处于同一网段)下的两台电脑进行对战。一般情况下无需配置IP。
-
一台电脑:点击创建房间,再启动一个UHLW游戏,在新启动的游戏中点击加入房间,等待一段时间后将会加入成功,通常等待时间将不会超过5s,绝不会超过10s。
-
两台电脑:先在一台电脑中创建房间,然后再在另一台电脑中加入房间,客户机将会自动搜寻局域网下的UHLW游戏,等待客户机找到IP后将会加入成功,等待时间将不会超过5s。
-
未找到玩伴?若这是网络波动问题导致的,则可用解决方案一:再找两次;若您的电脑中曾配置过许多虚拟机(虚拟网卡)则容易找错局域网段,于是需要手动配置主机IP,解决方案二:在客户机的jar包文件夹中新建一个名为
webConfig.txt
的文本文件,在该文本文件中输入主句的IP地址即可,如192.168.32.2
. -
等待界面如下:
-
-
显示如下界面即可成功开始对战
-
创建游戏的一方将操纵葫芦娃,而另一方将操作妖怪。
-
一回合中您可以进行如下操作
- 点击您这一方的人物,选中它
- 点击地图高亮部分,可以使得人物消耗对应的移动点数,移动到目标地点,若剩余移动点数(速度属性)为0,则人物不可再移动,每回合开始时移动点数重置。如果您有需要,也可以使用WASD进行移动。
- 将鼠标移动至技能图标上,可以查看该技能效果,消耗,伤害类型等等
- 点击技能图标,可以使得人物使用该技能,此时,地图高亮部分将变化为技能范围。之后点击高亮部分将对高亮位置使用该技能(若该次释放合法),例如:无法对空气释放伤害性技能,但是可以对空气使用位移性技能。
- 若想退出使用技能的状态,只需右击鼠标即可,此时,地图高亮部分将变化为人物可达距离。
- 按下空格键,开始录制本局比赛。该录制将在再次按下空格后停止并保留到和jar包同一目录下的record文件夹中/录制行为也会在游戏结束或关闭窗口后自动停止并保留到record文件夹中。
- 若您本回合无事可做,可以点击左方的结束回合的按钮,结束该回合
-
在双方各自进行了一些回合后,一方无可操纵人物,游戏结束,失败一方显示界面如下:
-
在点击“菜”字样后将会回到主界面,您可以在主界面再来一局游戏,或是观看录像
-
要想观看录像,点击主界面的加载回放按钮
-
选择record目录下的任一文件均可进行观看,文件名称按录制开始时间排序,注意,最多支持100份录像。
-
选中一个文件,并点击打开,进入录像界面
-
录像将会自动播放,在该界面中无法操纵任何人物,所有按钮都将变灰,录像播放完成后将会显示如下界面
-
点击“完”字样,可以回到主界面。
- record
- 0.sav :录像文件,较短的战斗
- 1.sav: 录像文件,较长的战斗
- src
- main
- java
- Main.java: 入口类
- cn.edu.nju
- effect: buff相关代码逻辑
- field: 战场相关代码逻辑
- main: 控制各个界面的代码逻辑
- record: 回放的代码逻辑
- role: 葫芦娃,蛇妖等生物
- web: 网络通信
- resources
- fxml:文件夹,存放界面
- img: 文件夹,存放图片
- java
- test
- java
- TestCase.java 单元测试代码
- java
- main
- pom.xml: maven配置
新加入的网络通信方面的要求确实对游戏提出了极高的考验,也确实给我带来了很大的麻烦,曾经使用“天王盖地虎”,“宝塔镇河妖”这样的口令来匹配两个游戏玩家,但由于两个机器字符集的不同,导致中文发送过来是乱码,最终采用了“UHLW”作为通信暗号。
首先,将通过一定的技术手段查找本机的可通信IP地址,得到该IP地址后,对最后一段遍历1到255,尝试对暗号“UHLW”,对暗号成功则进行游戏界面。这里的“技术手段”引用了网络上的https://blog.csdn.net/u011809209/article/details/77236602
然而并不能够稳定的获得想要的网段。翻阅资料后发现这是由于一些电脑安装了虚拟机,从而会拥有一些虚拟网卡,导致IP地址找到的实际上是虚拟机的IP,由于时间关系,这个问题并没有得到解决,而是紧急加入了手动配置的方法---在jar包的同一目录下新建一个名为webConfig.txt
的txt文件,在其中输入主机的IP,即可用主机IP网段进行查找。
注意,查找过程需要一定时间,通常不会超过10s。
回合制对战对网络通信的要求并不高,但也存在一定的困难性。这里我们用来同步移动和技能使用的socket即是上一步中建立连接的socket。人物在进行移动操作后会发送move <creature_ID> <target_x> <target_y>
这样的指令到socket中,而独立于界面线程始终有另一个线程尝试从socket中获取信息,每当其获得到信息后,就将该信息进行解析,并执行相关代码。使用技能则是发送skill <creature_id> <skill_index> <target_x> <target_y>
这样的指令,进行解析并计算血量和魔法值消耗责备放在本机进行。当一方结束回合后,将会发送end <round_num>
通知另一方进行下一回合。当一方全部阵亡后,双方其实都会监测到这一过程,但仍然发送消息game over
提示对方游戏结束,进行游戏结束相关代码逻辑。
这里的协调工作大部分都是异步的,网络通信相关的在上一条中已经说过,不再赘述。这里主要介绍动画演出和后台逻辑的分立。
在javaFX中有TimeLine
与AnimationTimer
类,可以做到设置关键帧和演出结束代码逻辑,于是,可以在每次需要动画演出时,新建一个TimeLine对象,初始化其关键帧,并将其在AnimationTimer对象中播放,在播放完成后完成一些对象销毁工作。这里在播放的同时可以进行后台逻辑的计算。
在寻找网络主机的过程中,界面并不是卡死的,这里将一直播放类似下方图示一样的动画:
要做到这一点只需让网络通信相关代码逻辑在另一个线程中跑,并在完成时通知Apllication线程即可。这里主要利用了javaFX中Task
的观念,Task可以定义一个多线程任务,并在此过程中设置update信息用于提示其他线程,于是只需要把完成信号与Apllication绑定即可。
基于我们网络通信的理念,回放机制实际上就很简单了。
录制:
- 保存生物信息:在用户请求录制后,立即保存八个生物的所有信息,如生命值,buff效果,位置等等
- 保存指令信息:这之后在网络中每次收发信息时,同时记录一份到存档中
- 录制结束:用户再次按下SPACE,或战斗完成,或窗口关闭都将使得录制结束并将内容写入磁盘
回放:
- 加载生物信息:将保存的生物状态恢复,按保存信息将他们安排到战场相应位置
- 执行指令:直接调用原本解析网络指令的函数用于执行指令,每次只执行一条相关指令,待动画效果演出结束后调用下一条指令解析。
- 回放完成:遇到
game over
指令或到达最后一条指令后回放完成,并显示回放完成的相关界面,点击该界面即可返回主界面。