An opinionated 2D game engine for Rust focused on simplicity, explicitness, and type-safety.
Coffee is in a very early stage of development. Manybasic features are still missing, somedependencies are experimental, and there are probablymany bugs.Feel free to contribute!
And more! Check out theexamples to see them in action.
Addcoffee
as a dependency in yourCargo.toml
and enable a graphics backendfeature (opengl
,vulkan
,metal
,dx11
, ordx12
):
coffee={version="0.4",features=["opengl"]}
Rust is quite slow in debug mode. If you experience performance issues whendrawing hundreds of sprites, enable compiler optimizations in yourCargo.toml
.I recommend level 2 optimizations in order to stay closer to--release
performance:
[profile.dev]opt-level=2
Coffee moves fast and themaster
branch can contain breaking changes! Ifyou want to learn about a specific release, check outthe release list.
Here is a minimal example that will open a window:
usecoffee::graphics::{Color, Frame, Window, WindowSettings};usecoffee::load::Task;usecoffee::{Game,Result, Timer};fnmain()->Result<()>{MyGame::run(WindowSettings{ title:String::from("A caffeinated game"), size:(1280,1024), resizable:true, fullscreen:false, maximized:false,})}structMyGame{// Your game state and assets go here...}implGameforMyGame{typeInput=();// No input datatypeLoadingScreen=();// No loading screenfnload(_window:&Window)->Task<MyGame>{// Load your game assets here. Check out the `load` module!Task::succeed(||MyGame{/* ...*/})}fndraw(&mutself,frame:&mut Frame,_timer:&Timer){// Clear the current frame frame.clear(Color::BLACK);// Draw your game here. Check out the `graphics` module!}}
Browse thedocumentation and theexamples to learn more!
Coffee builds upon
winit
for windowing and mouse/keyboard events.gfx
pre-ll for OpenGL support, based heavily on theggez
codebase.wgpu
forexperimental Vulkan, Metal, D3D11 and D3D12 support.stretch
for responsive GUI layouting based on Flexbox.glyph_brush
for TrueType font rendering.gilrs
for gamepad support.nalgebra
for thePoint
,Vector
, andTransformation
types.image
for image loading and texture array building.I am quite new to Rust, systems programming, and computer graphics. I amlearning along the way as I build the engine for a game I am currentlydeveloping. I am always glad to to learn from anyone.
If you want to contribute, you are more than welcome to be a part of theproject! Check out the currentissues if you want to find something to workon. Try to share you thoughts first! Feel free to open a new issue if you wantto discuss new ideas.
Any kind of feedback is welcome! You can open an issue or, if you want to talk,you can find me (and a bunch of awesome folks) over the#games-and-graphics
channel in theRust Community Discord. I go by@lone_scientist
there.
ggez
, an awesome, easy-to-use, good game engine that introduced me toRust. Its graphics implementation served me as a guide to implement OpenGLsupport for Coffee.