This is the source code of my game Panda Doodle, which can be played at https://pandadoodle.lucamoller.com/ (it's best playable on touch screen devices).
For more information, check out the article I wrote (Rewriting my mobile game in Rust targeting WASM) describing the background, the motivation and my experience while working on this project.
This code was written for fun and originally for my eyes only. I tried to clean/organize things up a bit (believe me it was much messier) in order to share it, but there's so much more that could be done. Also, this code was not intended to be "rusty". On the contrary, I was trying to see how far I could go by writing non-rusty code in Rust (I talk more about this in the article mentioned above). So please forgive me if something hurts your eyes :)
For someone trying to develop games with Rust+WASM, I think the most useful part of this repository is the engine module. It contains the basic functionality for interacting with the browser APIs (like rendering on Canvas2d and input) and also basic frameworks/utilities the game relies on for animations, UI, etc. The code there is fully independent from the game logic and doesn't depend on any game specific logic/types (I guess I could have extracted it in a separate crate). It's not a generic engine with a broad set of features though, it contains exactly the features the required by the game, which were implemented as needed haha.
This repository contains all assets (including images, sounds and stages data) necessary to build and run the game.
Install rustup https://www.rust-lang.org/tools/install
Install wasm-pack https://rustwasm.github.io/wasm-pack/installer/
# Builds the project and opens it in a new browser tab. Auto-reloads when the project changes.
# Builds the project and places it into the `dist` folder.
npm run build
# Runs tests in Firefox
npm test -- --firefox
# Runs tests in Chrome
npm test -- --chrome
# Runs tests in Safari
npm test -- --safari
Cargo.tomlcontains the standard Rust metadata. You put your Rust dependencies in here. You must change this file with your details (name, description, version, authors, categories)
webpack.config.jscontains the Webpack configuration. You shouldn't need to change this, unless you have very special needs.
htmlfolder contains the index.html file which is the landing page in which the game runs.
index.jsis used to hook everything into Webpack, you don't need to change it).
srcfolder contains your Rust code.
staticfolder contains any files that you want copied as-is into the final build.