Skip to content

Latest commit

 

History

History
130 lines (62 loc) · 4.49 KB

README.md

File metadata and controls

130 lines (62 loc) · 4.49 KB

概要

本程序是一款基于 FXGL,javafx,netty 开发的类 Tetr.io 的支持双人局域网联机的俄罗斯方块对战游戏,采用 SRS 超级旋转系统 ,攻击方式和受击方式参考了 Tetr.io 的攻击方式 (但是不支持 Back-To-Back ),支持在设置中自定义参数,并保存在本地。

1 程序的运行环境、安装步骤

  1. 运行环境:JDK 21

  2. 程序的组成部分:文件夹 config,MyTetr.jar

  3. 安装步骤:

​ (1) 安装 JDK 21

​ (2) 下载文件夹 MyTetr 到电脑上

​ (3) 打开命令提示符窗口,输入以下命令:java -jar MyTetr.jar

​ 或 在资源管理器中双击 MyTetr.jar,即可运行程序

原本是试图使用 exe4j 或者是手写 bat 命令来实现在无 jdk 环境下,仅依赖 jre 文件夹来运行的,但是都会报错:Java.lang.NoClassDefFoundError: sun/misc/Unsafe

2 程序开发平台

  1. 代码行数:3,390 行(不含空行)
  2. 开发环境:IntelliJ 2024 + JDK 21

3 程序功能说明

主菜单界面

image-20241226185347839

(1) 单人模式,自由练习

image-20241226190342459

(2) 多人模式

image-20241226191035673

image-20241226190953753

1 Server 端

​ 点击创建房间

image-20241226191102806

​ 玩家2 进入后,点击开始即可开始。

image-20241226191202679

2 Client 端

输入房间 ip 后点击加入房间即可

image-20241226191035673

进入房间后等待 玩家1 开始。

image-20241226193125046

(3) 设置

image-20241226191655450

退出时会询问“是否保存修改”。

4 程序算法说明及面向对象实现技术方案

顶层是通过 Application 作为入口点,通过 GameApp 来管理游戏场景。

image-20241226191930677

gameScenes 包中是所有出现的场景。

image-20241226192031710

gameWorld 包是完成游戏主逻辑的,其中 PieceComponent 有一个基类是 OnePieceComponent ,所有的 PieceComponent 都继承自它。

image-20241226192150907

netWork 包负责所有与网络通讯相关的功能。

image-20241226192350365

5 技术亮点、关键点及其解决方案

  • 技术亮点:使用 FXGL、javafx、netty 开发,性能优秀。

  • 健壮性展示:

    无网络连接时:

    image-20241226193008737

    无法连接服务器时:

    image-20241226193034787

    有玩家对战中退出对战,但还保持网络通讯时:

image-20241226193152785

有玩家对战中断开了与对方的网络通讯连接时:

image-20241226193428921

  • 本程序的技术关键点:

    采用按需刷新的网络更新策略,对网络带宽要求小。采用 FXGL 的 Entity-Component 模式来设计,结构清晰。

  • 遇到的技术难点及对应的解决方案:

    项目初期,发现 FXGL 不支持多场景的游戏(如一个单人模式,一个多人模式),经过寻找发现了一个基于 FXGL 和 javafx 的拓展库 fxcity,支持多场景的切换,后续均使用 fxcity 作为底层。

6 小结

FXGL 虽然是 java 中游戏引擎的领头羊,但是感觉还是有许多不足,比如没有多场景界面,Entity 和 Component 生命周期管理不清,因此不具备开发大型项目的潜质。网络上所有关于 FXGL 的项目均是小游戏性质的,以后应该不会再去碰 FXGL 了。相比之下,可能单纯使用 javafx 会更方便一些。

关于 Netty 方面,这是第一次接触网络通讯相关的编程,也是一路摸爬过来了,功能是搞定了,但是代码方面规范性欠缺,隔离性也欠佳。