Are we game yet? – A guide to the Rust game development ecosystem
arewegameyet.rs
arewegameyet.rs
I agree with Weebs assessment as well. But in particular, bevy has an extremely simple ECS api.
(Though, I will admit, I’ve only dabbled in this space and mainly followed some tutorials, so your mileage may vary)
Rust won't let you have arbitrary mutable aliasing or risk dangling pointers, so you'd end up fighting the language. In Rust ECS is actually easier, and it's a better fit for the single ownership, shared XOR mutable model.
- Game genre / mechanics
- Your team size/skill sets/experience
- Game engine
- Target platform(s)
- Monetization strategy
2d games in particular support a wide variety possibilities. If you narrow it down I can more easily point you in the direction of specific helpful resources.
Godot has a little bit of a learning curve, but easily justifies it. I've made some games in it: https://yumaikas.itch.io/. Godot, for 2D games, for me, has been a force multiplier in terms of what I can get done in X hours. For Hobbyist work, that just means you can take on more ambitious projects without having to do as much groundwork.
Barring that, you could look into bindings in your language of choice to Raylib. I've used a tiny bit of it with Janet via Jaylib.
If Lua or Fennel aren't hateful to you, there's always Love2D, TIC-80, or PICO-8. But, tbh, I really recommend learning Godot.
Games like Pokemon/Zelda are very content driven and usually don't have any sort of complex systems that require deep access to game engine internals. As someone working solo, you are going to want to spend most of your time creating fun/interesting content. Tools for this genre have been built many times before by people with far more experience building them. If you spend your time rebuilding them yourself, it's a recipe for stalling out without having much to show.
If your goal is really to just have fun building out gameplay systems as a programming challenge, I recommend using a lightweight code-oriented scripting language engine. Some good examples in this space are LÖVE (Lua, https://love2d.org/) or Phaser (Javascript, https://phaser.io/). These will allow you to jump right in to building games without needing to learn a graphical UI and are usually more agnostic about how you build your game than fully featured environments.
If you prefer the latter, but still want to end up with a finished game at the end, I recommend scoping down from an RPG to something like a Sokoban-style puzzler (https://en.wikipedia.org/wiki/Sokoban). Use a tool like Puzzlescript (https://www.puzzlescript.net/) to prototype your mechanics. Once you've finalized your mechanics you can then recreate it in the engine of your choice and add any polish. Having a playable prototype will make it much clearer what systems you will need to build.
Best of luck building!
I've used Unity in the past and mostly liked it, but it is infuriating that they haven't fully solved the problem of feedback loops (slow refresh times in the Unity editor with a small project after code changes) given that they're operating in a fully managed context.
- love2d (https://love2d.org/)
- PICO-8 (https://www.lexaloffle.com/pico-8.php)
- Clickteam Fusion (https://www.clickteam.com/clickteam-fusion-2-5)
- Godot (https://godotengine.org/)
- Stencyl (http://www.stencyl.com/)
- pygame (https://www.pygame.org/)
After 2ys doing rust all I can say is that it is nice as long as you know exactly what you want to do. And you often hit the wall because rust is still very young and there are not many libraries.
And more you know rust and do advanced stuff the more you hit bugs & unfinished things in rust itself. And I can tell you it's really hard to swallow when you need to redo something for the third time just because you are ahead (and nightly doesn't really help, sometimes it just opens another bag of bugs because those new features do not work together)
Try doing some GUI in rust, there's literally nothing complete right now, druid & iced are the most promising ones but still far from production-ready.
- HaxeFlixel (https://haxeflixel.com/) (Extremely portable)
- Phaser (https://phaser.io/) (HTML5 framework)
- Nico (https://github.com/ftsf/nico) (The PICO-8 API in Nim)
- Pixel Vision 8 (https://pixelvision8.github.io/PixelVision8Website/) (Another fantasy console)
I used it to master how to write a basic video game, without falling into the intricacies of C++ to hack out a video game.
I mastered all the mechanics of 2D video games, similar to the Nintendo and PlayStation games of the 1980s and 1990s.
I finished it in a weekend. Well, I put in 16 hour days, so it was more like a week’s work. Granted, I did have other development experience, but this was my first foray into video games.
I was driven to complete it, when I realized it was possible to actually make money as an independent video games developer. Still difficult, but possible.
I was thinking of turning this into a book or a video tutorial series. It would be helpful to crack the mysteries of game development for the new programmer.
I wonder if anybody would be interested in such a book? Or such knowledge.
The median quality of the talks is a fair bit higher than random blogs. There are some amazing gems and duds too.
There are friendly veterans there who will answer all kinds of game questions (not just about DragonRuby).
- [Remaking Cavestory in c++](https://www.youtube.com/playlist?list=PLNOBk_id22bw6LXhrGfhV...)
- [Dive into C++11/14](https://www.youtube.com/playlist?list=PLTEcWGdSiQenl4YRPvSqW...)
If you're interested in learning more about this, I can't recommend enough The Art of Game Design: A Book of Lenses. The gist is that it's hard to make an actually fun game by working "from first principles", you need to iterate tens if not hundreds of times just to get a solid game idea down (more subtle aspects like balance may require thousands of iterations). So a lot of the work of a game designer is coming up with ways to iterate extremely fast, e.g. by making a prototype of the game using paper figurines and writing the rules in a google doc.
A zillion years ago I used to do hobby games as a solo dev, and it took me a long time to understand this. I was always interested in game engine elements (sprites, tilemaps, input, menus, audio, pathfinding, etc), and I could put those elements together to make halfway decent games (usually by copying existing genres). But assembling those elements is a skill of its own, and this is easy to overlook if you're a programmer who thinks programming is the only challenge to making a game (or making anything :)).
I didn't truly appreciate game design as a skill until I worked with a separate game designer on a project. He made decisions on things that would have never crossed my mind. From that point on, I started seeing game design everywhere. Notably, I started seeing it in older games, ones I had played many times and that inspired me to get into game dev in the first place. I hadn't realized how well thought out the classics were.
This is called "greyboxing" in game dev, where you build functionality (often levels) with plain grey boxes rather than actual art assets to test whether a concept is fun, playable, etc.
For game design process Game Design Workshop and Challenges for Game Designers are good books that cover process comprehensively (TLDR is quick concept, prototype, play test, refine).
I just started playing around with it and honestly, I like it a lot.
I've never used Pico-8 before, but from what I understand the Tic80 is pretty much the same, but with about twice the 'specs' of the pico-8.
The community is a lot smaller, but it'd be awesome to see it get more support.
It gives you a nice integrated environment for code, art, SFX and music, with limitations that make it more likely to avoid feature creep and actually letting a solo dev finish a full game in a reasonable time frame.
I'm a mobile app (not game) perspective. For many years, I always want to make cool 3D game like GTA, unfortunately due to it's complexity it's impossible to write such game alone.
Probably I'll learn writing smaller games, instead :D
If I had to pick one, I'd say go with raylib. Free, open source, lightweight, portable, friendly and helpful Discord community, super helpful and friendly and engaged lead dev, bindings to tons of languages, builds for many platforms, straightforward high-level API that is sufficiently documented by a simple cheatsheet, a great set of related gamedev tools taht are also developed and maintained by the same lead dev, and it's just a (C99) library, not an inverted-control framework. So you just have a while loop in main() that checks for whether the window should be closed and lets you do whatever updates in whatever order you want.
If you ultimately develop commercial indie aspirations, you may want to move to GMS2 as it makes it easier to do things like publish to consoles and integrate Steam APIs. Tons of commercial indie hit have been made and continue to be made with GMS2.
Stay away from Unity....2d is a second-class citizen in Unity.
Asylum - Choose your own adventure style interactive narrative
Knights and Barbarians - Simple turned based strategy game
Legend of the Rusty Dragon - Simple adventure game inspired by Legend of the Red Dragon
https://github.com/MaulingMonkey/cargo-html/wiki/Examples#ru...
I've sent a couple of PRs for things I found useful - feel free to ignore them if they're not to your liking ;)
https://bfnightly.bracketproductions.com/rustbook/chapter_0....
https://pragprog.com/titles/hwrust/hands-on-rust/
If you’re looking for a simple project to start with, adding new Items or Leaders to Shotcaller (my game) should be quite straightforward after perusing some of the above resources. https://github.com/amethyst/shotcaller
We’re happy to help any newcomers along on our Discord: https://discord.gg/qvJyTYM
Maybe the last updated status could be brought to the arewegameyet page?
From what I've experienced, these sites largely go via passive maintainance, ie, based on pull requests and issues, not actively developing or updating things.
To assess that, users need to skim the code and documentation to gauge for themselves. There is no universal score. This is a feature, not a bug.
Only popular crates would have a chance to have support contracts like this.
Bus Factor could be a bucketed 90-percentile count on the contributors. Active Maintenance and Passive Maintenance could be established by looking at PRs and Issues and how many commits aren't directly related to them. Last Release Tag is easy.
That site instead displays usage metrics, which are much more useful: they tell you whether other people find that library useful right now.
I don't care whether a flac decoding library was updated in the last decade if it does its job.
Long ago I've read on Reddit a programmer posted his detailed experience of the problems they've found on a non-trivial game, but I can't find it. I also wonder if anything changed.
Inside Rust at Embark: https://medium.com/embarkstudios/inside-rust-at-embark-b82c0...
Using Rust For Game Development by Catherine West: https://www.youtube.com/watch?v=aKLntZcp27M
Counter-rant from Jonathan Blow: https://www.youtube.com/watch?v=4t1K66dMhWk
I've just watched the first 20 minutes of that video. So far, it's all "yeah, she's basically right". When does he get to the point? I.e., what does he actually object to?
its a pedantic nitpick, as is his way. also keep in mind that of late Blows focus has been single player video games made by very small very talented teams. A domain where the benefits of Rust are very small, possibly even a net loss compared to the fast compiling language they use now.
I don't see how that's the case [1]. The entities are owned by the ECS (or the game state, or whatever), not by each other. Entities can conceptually reference each other, but not own each other. The only time this is problematic, is when one entity is destroyed while another one is still holding a reference to it. At the beginning of the video, he discussed basically all approaches to solve that problem:
1) Raw pointers. Bad for obvious reasons.
2) Smart pointers which keep the referenced object alive. No good, he says, because one entity should not keep another one alive, if the game logic says it should be removed.
3) Weak pointers which are safely invalidated when the referenced entity is removed. No good, he says, because keeping track of back-references is inefficient.
4) Weak pointers which check whether the referenced entity is still alive before accessing it. Which is exactly what the ECS does. Rust's ownership semantics still help here, because entities are unambiguously owned by the ECS, which returns a type-safe None value when you try to access a deleted entity.
[1] I'm not arguing against you, indy; I understand that you paraphrased Blow's argument.
And by breaking things into components the granularity of ownership is increased compared with the equivalent concrete representation of the same data. So whilst you can’t reason about ownership of an entity as it primarily exists conceptually the ownership of its constituent parts is well defined.
He seems to disagree with that secondary thesis. He thinks she did a good job implementing a toy ECS, but that Rust itself wasn't particularly helpful to her.
https://www.reddit.com/r/programming/comments/atyzz4/halley_...
Also: https://prev.rust-lang.org/pdfs/Rust-Chucklefish-Whitepaper....
For example, if I were to write a library (e.g. a physics engine) in Rust, how easy is it for game developers to incorporate it into their C++ games? Would they need to set up a separate Rust toolchain alongside their existing C++ one? It seems it would be much harder to for them to include my library compared to a competing one that’s written in C++ - especially if the competing library is available as a single header file.
They have Blueprints[1] (visual scripting) and had a scripting language. However, they have removed it since then.
1: https://docs.unrealengine.com/en-US/ProgrammingAndScripting/...
Godot is talked about on Hacker News but it's nowhere in the industry, as for C++ it's the default language for games and it will be the case for the foreseeable future.
I feel that there is a real disconnect between hacker news and people working in the industry.
Most people here don't seem to understand how different it is from your regular CRUD app compagny.
On the Switch alone, a very big chunk are all based on Unity, more than 50% as per Unity official statement.
Also although the engine is still mostly C++, they have been porting the rendering pipeline into HPC#.
If there will be a transition to any other language in that space, it'll take a decade or two.
At this time we only target the VFX C++ ecosystem but I'd be surprised if people wouldn't use (and extend) this to cover a broader set of C++ libs.
Maybe you can give an example of a C++ API that you deem not "translatable to C"?
"Corrosion, formerly known as cmake-cargo, is a tool for integrating Rust into an existing CMake project. Corrosion is capable of importing executables, static libraries, and dynamic libraries from a crate."
OpenCV on the other hand seems to instantiate all possible variants of cv::Mat for their Python bindings. They don't such a big space of valid and useful template parameters and IIRC the specifics are abstracted away from the algorithms working on them.
Unless the maintainer is directly involved in godot or something (I couldn't see any evidence of this from quickly checking their profile), it looks like a community effort to me.
Mozilla has also published information on how they are rewriting components in Rust and integrating them into the Firefox codebase, though they were using C apis - exposing Rust to C and vice versa is relatively straight-forward.
The C ABI is the lingua franca still, you can call it from all of the above. And you can expose a C ABI for your Rust library.
Only tangentially related but if you are looking for a 2d graphics crate peep femtovg https://github.com/femtovg/femtovg
And join the discord https://discord.gg/V69VdVu
I'm still waiting on Rust to mature a bit, but I might experiment with building a game in something aside from Unity for my next project.
This is just a UI glitch. No memory shenanigans needed.
Definitely a downside :/ On a side-note: I'm fairly sure the ST trick + -XLinearTypes will allow a better & still type-safe arena allocator to be written in Haskell than is currently possible in Rust.
Looks like that implementation doesn't, but the borrow checker can definitely specify that sort of constraint (it looks `fn foo(self) -> Self`). I think it's not exposed because the code assumes that all but the last chunk are completely filled - but it could also just be that no one asked for that.
Reclaiming should theoretically be possible too via a method that takes ownership of the arena (the borrow checker prevents moves while an object is borrowed).
Custom allocator support for the std types (Vec, HashMap, etc) is coming, but at a snails pace.
(A few months ago, I actually gave the game a try. I had a good time and it was very funny to post about.)
There's a problem though, the hard-drive firmware isn't written in rust, which is definitely cheating :P
I mean someone even managed to run linux on the harddrive, it's practically a whole extra computer we are using to build rust and it is undoubtedly programmed in C.
I had to look this up because I could hardly believe it.
http://spritesmods.com/?art=hddhack&page=1
Wat.