LDawns / Under-HuLuWa

JAVA GAME

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Under HuLuWa(UHLW) 2.0

Designed By 计算机科学与技术系 171860524 李思勉 2021.1.4

游戏特色

  • 大场景,多元素的地图
  • 清晰的UI
  • 32种不同机制的技能,策略搭配
  • 无需配置IP,自动局域网搜索
  • 无需WASD,依靠鼠标智能寻路
  • 华丽丰富的技能特效
  • 丰富的伤害机制
  • 长达2900行的代码逻辑,内容丰富

清晰易懂的UI

  1. 敌人血量与魔法值显示在左上角
  2. 选中可操纵人物的技能,属性,血量等等显示在下方
  3. 每回合可移动的距离高亮显示在地图中,技能可达范围同样如此
  4. 左侧一长条的空白处是显示战斗信息的,例如:“大娃使用了大荒星陨,效果拔群!”

siw3cj.png

大场景地图+各种地图要素

6v2回合制不对称竞技,人妖分立在地图两侧,战场**为各种障碍物,丰富了游戏策略性

丰富的伤害机制

每名人物拥有武力、智力、护甲、魔抗、速度和攻击范围共计六项属性,技能也分为物理伤害与魔法伤害,此外,游戏过程中友方或敌方会对自己施加buff从而改变属性,机智的利用各项属性去击败对手是一个不错的策略,比如蛇妖的魔抗很高,护甲却很低,应该利用物理伤害型技能对其造成伤害。

丰富的技能机制

六个葫芦娃与两名妖怪共计8个人物,每名人物都拥有普通攻击,防御姿态两个共同技能,外加两个人物的特殊技能,共计32个技能,每回合人物都可以使用四个技能中的一个,因此人物之间各种技能配合不同可能对战局影像极大!下面拿出几个例子展示:

  1. 普通攻击,造成基于武力值的物理伤害

siwl9g.png

  1. 防御姿态,减少接下来受到的所有伤害

sidHtU.png

  1. 大荒星陨,牺牲自己的技能,位移致目标位置,并对周围一格的敌人造成大量伤害

sid7kT.png

4.伪·罗玄剑,射程及其远的技能

sidbhF.png

此外还有32个技能限于篇幅就不一一介绍了,到游戏中体验吧。

华丽的技能特效

除去技能机制复杂,特效同样如此!这里只列出四个,其余还有很多很多,游戏中体验吧

  1. 闪现特效

    sidxn1.png

  2. 毒雾特效

sidjXR.png

  1. 寸劲·开天 特效

sidz0x.png

  1. 炎爆术 特效

siw9AK.png

智能寻路

受够了WASD的操作了吗?本游戏支持自动寻路,只需鼠标点击目标位置,人物就会自动选择一条最短路走过去,太棒了!

智能搜索

自动搜索同一局域网下的游戏玩家,不用再繁杂的输入IP啦!当然,可能由于虚拟机等问题造成搜索不到,也可以人工输入主机IP来匹配。

siwPhD.png

丝滑的移动

拒绝闪现式移动,人物拥有四个方向的移动动作

siwS76.png

支持多次游玩

游玩一次结束后会依据胜负不同显示不同的画面:

失败画面:

siwZnI.png

之后点击该画面即可回到主菜单,可以自由选择重开一局或者是加载回放。

完整的测试

使用JUNIT单元测试,对角色加载,角色移动,角色使用技能等多种逻辑进行了测试

游戏及录像体验流程

  1. 从github下载源码与存档文件

  2. 编译环境要求:jdk14+,maven

  3. 按编译环境要求编译即可

  4. 等待编译完成,出现target文件夹

  5. 再次强调必须将JAVA_HOME设为jdk14+版本

  6. 双击target文件夹中的UHLW-2.0.jar,程序将会运行;若运行失败,可尝试命令行运行

cd target
java -jar UHLW-2.0.jar
  1. 出现以下界面即为运行成功

    siwmHP.png

  2. 可以在一台电脑上同时操作对战双方,也可以使用处在同一局域网(同时连接同一个热点或路由器,即要求处于同一网段)下的两台电脑进行对战。一般情况下无需配置IP。

    1. 一台电脑:点击创建房间,再启动一个UHLW游戏,在新启动的游戏中点击加入房间,等待一段时间后将会加入成功,通常等待时间将不会超过5s,绝不会超过10s。

    2. 两台电脑:先在一台电脑中创建房间,然后再在另一台电脑中加入房间,客户机将会自动搜寻局域网下的UHLW游戏,等待客户机找到IP后将会加入成功,等待时间将不会超过5s。

    3. 未找到玩伴?若这是网络波动问题导致的,则可用解决方案一:再找两次;若您的电脑中曾配置过许多虚拟机(虚拟网卡)则容易找错局域网段,于是需要手动配置主机IP,解决方案二:在客户机的jar包文件夹中新建一个名为webConfig.txt的文本文件,在该文本文件中输入主句的IP地址即可,如192.168.32.2.

    4. 等待界面如下:

      siwPhD.png

  3. 显示如下界面即可成功开始对战

    siw3cj.png

  4. 创建游戏的一方将操纵葫芦娃,而另一方将操作妖怪。

  5. 一回合中您可以进行如下操作

    1. 点击您这一方的人物,选中它
    2. 点击地图高亮部分,可以使得人物消耗对应的移动点数,移动到目标地点,若剩余移动点数(速度属性)为0,则人物不可再移动,每回合开始时移动点数重置。如果您有需要,也可以使用WASD进行移动。
    3. 将鼠标移动至技能图标上,可以查看该技能效果,消耗,伤害类型等等
    4. 点击技能图标,可以使得人物使用该技能,此时,地图高亮部分将变化为技能范围。之后点击高亮部分将对高亮位置使用该技能(若该次释放合法),例如:无法对空气释放伤害性技能,但是可以对空气使用位移性技能。
    5. 若想退出使用技能的状态,只需右击鼠标即可,此时,地图高亮部分将变化为人物可达距离。
    6. 按下空格键,开始录制本局比赛。该录制将在再次按下空格后停止并保留到和jar包同一目录下的record文件夹中/录制行为也会在游戏结束或关闭窗口后自动停止并保留到record文件夹中。
    7. 若您本回合无事可做,可以点击左方的结束回合的按钮,结束该回合
  6. 在双方各自进行了一些回合后,一方无可操纵人物,游戏结束,失败一方显示界面如下:

    siwZnI.png

  7. 在点击“菜”字样后将会回到主界面,您可以在主界面再来一局游戏,或是观看录像

  8. 要想观看录像,点击主界面的加载回放按钮

    siweBt.png

  9. 选择record目录下的任一文件均可进行观看,文件名称按录制开始时间排序,注意,最多支持100份录像。

  10. 选中一个文件,并点击打开,进入录像界面

    siwuAf.png

  11. 录像将会自动播放,在该界面中无法操纵任何人物,所有按钮都将变灰,录像播放完成后将会显示如下界面

    siwKN8.png

  12. 点击“完”字样,可以回到主界面。

工程目录介绍

  • record
    • 0.sav :录像文件,较短的战斗
    • 1.sav: 录像文件,较长的战斗
  • src
    • main
      • java
        • Main.java: 入口类
        • cn.edu.nju
          • effect: buff相关代码逻辑
          • field: 战场相关代码逻辑
          • main: 控制各个界面的代码逻辑
          • record: 回放的代码逻辑
          • role: 葫芦娃,蛇妖等生物
          • web: 网络通信
      • resources
        • fxml:文件夹,存放界面
        • img: 文件夹,存放图片
    • test
      • java
        • TestCase.java 单元测试代码
  • 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中有TimeLineAnimationTimer类,可以做到设置关键帧和演出结束代码逻辑,于是,可以在每次需要动画演出时,新建一个TimeLine对象,初始化其关键帧,并将其在AnimationTimer对象中播放,在播放完成后完成一些对象销毁工作。这里在播放的同时可以进行后台逻辑的计算。

等待界面

在寻找网络主机的过程中,界面并不是卡死的,这里将一直播放类似下方图示一样的动画:

siwPhD.png

要做到这一点只需让网络通信相关代码逻辑在另一个线程中跑,并在完成时通知Apllication线程即可。这里主要利用了javaFX中Task的观念,Task可以定义一个多线程任务,并在此过程中设置update信息用于提示其他线程,于是只需要把完成信号与Apllication绑定即可。

加载回放

基于我们网络通信的理念,回放机制实际上就很简单了。

录制:

  1. 保存生物信息:在用户请求录制后,立即保存八个生物的所有信息,如生命值,buff效果,位置等等
  2. 保存指令信息:这之后在网络中每次收发信息时,同时记录一份到存档中
  3. 录制结束:用户再次按下SPACE,或战斗完成,或窗口关闭都将使得录制结束并将内容写入磁盘

回放:

  1. 加载生物信息:将保存的生物状态恢复,按保存信息将他们安排到战场相应位置
  2. 执行指令:直接调用原本解析网络指令的函数用于执行指令,每次只执行一条相关指令,待动画效果演出结束后调用下一条指令解析。
  3. 回放完成:遇到game over指令或到达最后一条指令后回放完成,并显示回放完成的相关界面,点击该界面即可返回主界面。

About

JAVA GAME


Languages

Language:Java 100.0%