A game engine written in Nim, optimized for making cool games fast. Made for convenience while coding and better performance than all-in-one solutions like Godot.
Note: As of June 2021, I'm not longer actively working on rapid. Please fork the repository if you want to keep the project alive.
Goals
- Be easy to understand,
- Have a rich set of flexible APIs,
- Compile all C libraries statically to avoid dependency hell/linker errors,
- Make game development a fun task for everyone.
Features
rapid/graphics
- Almost stateless graphics context API – the only state you ever have
to worry about is the shape buffer
- Supports text rendering using FreeType
- Has a built-in polyline renderer for drawing wires, graphs, etc.
- Post-processing effects with HDR rendering support
- Built in texture packer
- Almost stateless graphics context API – the only state you ever have
to worry about is the shape buffer
rapid/game
- Fixed timestep game loop
- Fixed-size and infinite-size tilemaps
rapid/ec
- Minimal entity-component decoupling pattern implementation
rapid/physics
chipmunk
– General-purpose physics engine, using Chipmunk2Dsimple
– Simple and fast AABB-based physics engine
rapid/input
- Simplified input event distribution using procs like
mouseButtonJustPressed
+ callback support
- Simplified input event distribution using procs like
rapid/math
- Common math utilities for vector math, axis-aligned bounding boxes, interpolation, and type-safe units
rapid/ui
– Fidget-style UI framework for games and applications
Coming soon
rapid/audio
– Sound mixer with real-time effect support
Installing
Note that the new version of rapid (2020) is still under development, so you will have to install a specific commit from the master branch. The current release version is not supported anymore.
To install rapid, use the following command:
$ nimble install "rapid@#3e831cb" # change the commit hash to the latest commit
In your .nimble
file:
requires "rapid#3e831cb"
Pinning to a specific commit rather than #head
is recommended, because #head
doesn't name a specific point in development. This means that two different
packages may end up requiring #head
, and the #head
that's installed locally
may not match the #head
that's required by the package. Thanks nimble,
you're the best.
Linux
On Linux, the development headers for the following libraries must be installed:
- for
rapid/graphics
:- GL
- X11
- Xrandr
- Xxf86vm
- Xi
- Xcursor
- Xinerama
Debian and Ubuntu
sudo apt install \
libgl-dev libx11-dev libxrandr-dev libxxf86vm-dev libxi-dev libxcursor-dev \
libxinerama-dev
Fedora
sudo dnf install \
mesa-libGL-devel libX11-devel libXrandr-devel libXxf86vm-devel \
libXinerama-devel libXi-devel libXcursor-devel
openSUSE
sudo zypper in \
Mesa-libGL-devel libX11-devel libXrandr-devel libXxf86vm-devel \
libXinerama-devel libXi-devel libXcursor-devel
Examples
For examples, look in the tests
directory.
Tips
- Draw in batches whenever possible. This reduces the amount of time the CPU
has to spend sending draw calls to the GPU, making your game run better.
In general, whenever you have some object that doesn't change often, prefer
an aglet
Mesh
rather than rapid'sGraphics
. - Compile your game with
--opt:speed
. Nim's rather primitive stack trace system can slow programs down by quite a bit, so compiling with speed optimizations enabled can be quite important to maintain playable performance. Though if your game's so CPU-heavy that it becomes unplayable without--opt:speed
, you're doing something wrong. Go fix your code.
Contributing
When contributing code, please follow the coding style guidelines.
Super Secret Messages hidden in plain sight
A message to Araq
Fast incremental compilation when