{"id":23569081,"url":"https://github.com/cubicheng/mytetr","last_synced_at":"2026-04-19T04:34:09.500Z","repository":{"id":263925989,"uuid":"891595794","full_name":"Cubicheng/MyTetr","owner":"Cubicheng","description":"本程序是一款基于 FXGL，javafx，netty 开发的类 Tetr.io 的支持双人局域网联机的俄罗斯方块对战游戏，采用 SRS 超级旋转系统 ，攻击方式和受击方式参考了 Tetr.io 的攻击方式 （但是不支持 Back-To-Back ），支持在设置中自定义参数，并保存在本地。","archived":false,"fork":false,"pushed_at":"2024-12-27T01:52:57.000Z","size":46709,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-17T19:18:26.954Z","etag":null,"topics":["fxgl","fxgl-games","javafx-desktop-apps","netty","tetris-game"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Cubicheng.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-20T15:59:23.000Z","updated_at":"2024-12-27T01:53:00.000Z","dependencies_parsed_at":"2024-12-26T13:34:15.062Z","dependency_job_id":null,"html_url":"https://github.com/Cubicheng/MyTetr","commit_stats":null,"previous_names":["cubicheng/mytetr"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cubicheng%2FMyTetr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cubicheng%2FMyTetr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cubicheng%2FMyTetr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cubicheng%2FMyTetr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Cubicheng","download_url":"https://codeload.github.com/Cubicheng/MyTetr/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254493379,"owners_count":22080127,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fxgl","fxgl-games","javafx-desktop-apps","netty","tetris-game"],"created_at":"2024-12-26T19:12:05.235Z","updated_at":"2026-04-19T04:34:09.459Z","avatar_url":"https://github.com/Cubicheng.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"## 概要\r\n\r\n本程序是一款基于 FXGL，javafx，netty 开发的类 [Tetr.io](https://tetris.huijiwiki.com/wiki/TETR.IO) 的支持双人局域网联机的俄罗斯方块对战游戏，采用 [SRS 超级旋转系统](https://tetris.huijiwiki.com/wiki/%E8%B6%85%E7%BA%A7%E6%97%8B%E8%BD%AC%E7%B3%BB%E7%BB%9F) ，攻击方式和受击方式参考了 [Tetr.io 的攻击方式](https://tetris.wiki/TETR.IO) （但是不支持 [Back-To-Back](https://tetris.huijiwiki.com/wiki/%E8%83%8C%E9%9D%A0%E8%83%8C) ），支持在设置中自定义参数，并保存在本地。\r\n\r\n\r\n\r\n## 1 程序的运行环境、安装步骤\r\n\r\n1. 运行环境：JDK 21\r\n\r\n2. 程序的组成部分：文件夹 config，MyTetr.jar\r\n\r\n3. 安装步骤：\r\n\r\n​\t(1) 安装 JDK 21\r\n\r\n​\t(2) 下载文件夹 MyTetr 到电脑上\r\n\r\n​\t(3) 打开命令提示符窗口，输入以下命令：java -jar MyTetr.jar \r\n\r\n​\t\t  或 在资源管理器中双击 MyTetr.jar，即可运行程序\r\n\r\n\u003e 原本是试图使用 exe4j 或者是手写 bat 命令来实现在无 jdk 环境下，仅依赖 jre 文件夹来运行的，但是都会报错：Java.lang.NoClassDefFoundError: sun/misc/Unsafe\r\n\r\n\r\n\r\n## 2 程序开发平台\r\n\r\n1. 代码行数：3,390 行（不含空行）\r\n2. 开发环境：IntelliJ 2024 + JDK 21\r\n\r\n\r\n\r\n## 3 程序功能说明\r\n\r\n主菜单界面\r\n\r\n![image-20241226185347839](images/image-20241226185347839.png)\r\n\r\n### (1) 单人模式，自由练习\r\n\r\n![image-20241226190342459](images/image-20241226190342459.png)\r\n\r\n### (2) 多人模式\r\n\r\n![image-20241226191035673](images/image-20241226191035673.png)\r\n\r\n![image-20241226190953753](images/image-20241226190953753.png)\r\n\r\n1 Server 端\r\n\r\n​\t\t\t点击创建房间\r\n\r\n![image-20241226191102806](images/image-20241226191102806.png)\r\n\r\n​\t\t\t玩家2 进入后，点击开始即可开始。\r\n\r\n![image-20241226191202679](images/image-20241226191202679.png)\r\n\r\n2 Client 端\r\n\r\n输入房间 ip 后点击加入房间即可\r\n\r\n![image-20241226191035673](images/image-20241226191035673.png)\r\n\r\n进入房间后等待 玩家1 开始。\r\n\r\n![image-20241226193125046](images/image-20241226193125046.png)\r\n\r\n### (3) 设置\r\n\r\n![image-20241226191655450](images/image-20241226191655450.png)\r\n\r\n退出时会询问“是否保存修改”。\r\n\r\n## 4 程序算法说明及面向对象实现技术方案\r\n\r\n顶层是通过 Application 作为入口点，通过 GameApp 来管理游戏场景。\r\n\r\n![image-20241226191930677](images/image-20241226191930677.png)\r\n\r\ngameScenes 包中是所有出现的场景。\r\n\r\n![image-20241226192031710](images/image-20241226192031710.png)\r\n\r\ngameWorld 包是完成游戏主逻辑的，其中 PieceComponent 有一个基类是 OnePieceComponent ，所有的 PieceComponent 都继承自它。\r\n\r\n![image-20241226192150907](images/image-20241226192150907.png)\r\n\r\nnetWork 包负责所有与网络通讯相关的功能。\r\n\r\n![image-20241226192350365](images/image-20241226192350365.png)\r\n\r\n## 5 技术亮点、关键点及其解决方案\r\n\r\n- 技术亮点：使用 FXGL、javafx、netty 开发，性能优秀。\r\n\r\n- 健壮性展示：\r\n\r\n\t无网络连接时：\r\n\r\n\t![image-20241226193008737](images/image-20241226193008737.png)\r\n\r\n\t无法连接服务器时：\r\n\r\n\t![image-20241226193034787](images/image-20241226193034787.png)\r\n\r\n\t有玩家对战中退出对战，但还保持网络通讯时：\r\n\r\n![image-20241226193152785](images/image-20241226193152785.png)\r\n\r\n有玩家对战中断开了与对方的网络通讯连接时：\r\n\r\n![image-20241226193428921](images/image-20241226193428921.png)\r\n\r\n- 本程序的技术关键点：\r\n\r\n\t采用按需刷新的网络更新策略，对网络带宽要求小。采用 FXGL 的 Entity-Component 模式来设计，结构清晰。\r\n\r\n- 遇到的技术难点及对应的解决方案：\r\n\r\n\t项目初期，发现 FXGL 不支持多场景的游戏（如一个单人模式，一个多人模式），经过寻找发现了一个基于 FXGL 和 javafx 的拓展库 fxcity，支持多场景的切换，后续均使用 fxcity 作为底层。\r\n\r\n\t\r\n\r\n## 6 小结\r\n\r\nFXGL 虽然是 java 中游戏引擎的领头羊，但是感觉还是有许多不足，比如没有多场景界面，Entity 和 Component 生命周期管理不清，因此不具备开发大型项目的潜质。网络上所有关于 FXGL 的项目均是小游戏性质的，以后应该不会再去碰 FXGL 了。相比之下，可能单纯使用 javafx 会更方便一些。\r\n\r\n关于 Netty 方面，这是第一次接触网络通讯相关的编程，也是一路摸爬过来了，功能是搞定了，但是代码方面规范性欠缺，隔离性也欠佳。\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcubicheng%2Fmytetr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcubicheng%2Fmytetr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcubicheng%2Fmytetr/lists"}