dart_realtime_game
使用 Dart 和 Flutter 构建实时游戏的示例。
在全栈中使用 Dart,在客户端和服务器之间共享代码。
使用实体组件系统来管理游戏和网络传输。
我还没有(或者说尚未)实现客户端插值或预测,因此客户端仅在服务器更新推送时更新(目前每秒 10 次)。
这没有使用任何“游戏”框架,而是直接绘制到画布上。我发现大多数游戏框架没有将状态与渲染分离,所以我选择编写自己的(非常简单的)渲染层。
用法
本地开发
melos bootstrap # runs pub get for all packages
cd packages/server
dart run bin/serve.dart
cd packages/client
flutter run
我通常从终端运行服务器,从 VS Code 运行客户端。
本地构建 Docker 文件
docker build -f .\dockerfiles\frontend.Dockerfile -t frontend .
docker build -f .\dockerfiles\backend.Dockerfile -t backend .
已知问题
- 服务器在热重载时会泄露 2 个 PhysicsComponents。
- 服务器在玩家掉线时会泄露玩家连接(留下僵尸)。
- 即使没有玩家连接,服务器也会旋转。
我的 TODO 列表中剩余的项目(目前未计划进一步开发)
- 使渲染层从 GameState 进行插值。
- 删除所有 DateTime.now() 的使用,并将 clientTime 移至 Duration。
- 唯一可以访问 clientTime 的方式是通过 tick 回调的 elapsed。
- 让 WebSockets 自动重新连接。
- 鼠标单击时绘制动画。
- 添加玩家互相伤害的能力。
- 修复渲染以围绕位置居中绘制。
- 设置颜色和名字的能力。
- 通过按键/按钮触发的能力。
- 改变某些事物的拾取物/增益。
- 添加数据库来存储服务器状态。
- 让渲染更花哨(例如,行走周期)
- 添加背景图块(例如森林)
- 切换到 3d 前端。
灵感来源
- https://www.gabrielgambetta.com/client-side-prediction-server-reconciliation.html
- https://docs.unity3d.org.cn/Packages/[email protected]/manual/index.html
- https://github.com/flame-engine/oxygen