This project is an exploration of the Rust game development ecosystem, structured as a reusable template. The goal is to showcase how various crates can be integrated to build a game, hopefully making it easier for others to get started with Rust-based game development. If you're new to Rust or game development, this template can serve as a useful starting point.
- Game Engine: Built on top of Bevy, a data-driven game engine that emphasizes simplicity and modularity.
- Input Management: Handled with leafwing-input-manager for flexible input control.
- Physics: Powered by bevy_rapier for 2D/3D physics simulations.
- Level Editing: Support for LDtk, allowing one to design levels in a user-friendly editor and easily integrate them into your game.
The game is packaged with Nix, this ensures reproducible builds and complete deployments across different platforms:
- Linux: Supports x86_64 and aarch64 architectures.
- macOS: Works on both Intel and Apple Silicon.
- WebAssembly (WASM): The game can be compiled to run in browsers.
You can try the game online here: Play Now.
An automated end-to-end (e2e) system test ensures the game runs correctly by verifying that the main menu appears on startup. The NixOS e2e test framework:
- Spawns a virtual machine with an X server enabled.
- Launches the game.
- Uses OCR (Optical Character Recognition) to detect the main menu text, confirming successful startup.
The following sections explain how to obtain a development shell, what tools to use during development, and lastly what to run before committing.
There are two to obtain a development shell: you can configure direnv to be dropped in a development shell automatically when you enter the directory (recommended) or do it manually.
First, you will have to install direnv, by adding it to your Nix/NixOS configuration or using your package manager.
Afterward, add a .envrc
file to the root of the project:
touch .envrc
echo "use flake" >> .envrc
Next, enable direnv for this project:
direnv allow
Run:
nix develop
Inside the development shell, you can use cargo
as usual during development.
Because Nix gives us gives us a high degree of reproducibility, by building our project and running the checks locally and making them succeed, we can be very certain it will pass the pipeline too.
You can explore the buildable outputs of any flake project by running:
nix flake show
To build e.g. game
you can then run:
nix build .#game
To run all the "checks" of this project, like formatting, lint, audit, etc. checks, run:
nix flake check
To run a single check e.g. the format check, run:
nix build .#checks.<system>.treefmt
Code for the whole project tree can be formatted by running nix fmt
from the project's root or anywhere in the tree, but be warned that it will only format code inside the sub-tree.
The nix fmt
command currently formats all the Rust
and Nix
code in the tree. To add support for more languages you'll have to adjust the treefmt
attribute-set in the flake.nix
accordingly. A list of already supported formatters can be found here.