amethyst / amethyst/rustrogueliketutorial
Sharing save/load tricks (DRY, WASM)
- 主要言語
- Rust
- スター
- 970
- フォーク
- 166
- PR マージ指標
- 30日以内にマージされた PR はありません
説明
Hey @thebracket! Thank you for the amazing library and book, I'm having a blast following along. This is not so much an "issue", but rather sharing what I learned in case you want to use it in the book at some point. I'll do it tl;dr style to respect your time:
* I've added saving / loading under WASM in https://github.com/abesto/rktrl/commit/b0da9c00125ba9bc2335f0403576b28e56c063f5. Basically it uses local storage (base64 encoded, because I GZip the saved file on the cross-platform code path).
* FWIW, the sentence "Supporting saving via LocalStorage (a browser/JavaScript feature) is planned for a future version of RLTK." confused me for a second - RLTK doesn't explicitly support saving / loading outside the browser either, it's all `serde` and `specs` (AFAICT at least).
* Reaching for increasingly big hammers, I managed to set up a procedural macro so that for the save / load systems there is zero repetition of the components (check out [the macro](https://github.com/abesto/rktrl/blob/b0da9c00125ba9bc2335f0403576b28e56c063f5/rktrl_macros/src/lib.rs) and [its usage](https://github.com/abesto/rktrl/blob/b0da9c00125ba9bc2335f0403576b28e56c063f5/src/systems/saveload.rs#L34-L60)). The big idea here is using the macro to split the tuple of components into chunks of at most 16, so that we can then rely on the the `specs_derive`-provided implementations for those.
* I'm toying with the idea of creating a similar macro to cut down on the boilerplate involved with creating system data structs (but that's less relevant as currently the tutorial doesn't use them)
* Getting things to compile for WASM in the first place was a bit tricky as dependencies pulled in parallel Specs features in their `default-features`, which trigger threading. Had to disable them in `cargo.toml` (see https://github.com/abesto/rktrl/commit/72a7a119385ca6ae5c6871dd31d281ba842d0ffe). I guess there might be a better way of doing this (maybe controlling whether a parallel dispatcher is used from code).
Finally, I wanted to add that I know how overwhelming input about big huge changes to writing projects can be, so wanted to explicitly say: no pressure, take these when and if they're useful. Even until then, maybe this will in itself be useful for someone else. Thank you again!
コントリビューションガイド
このリポジトリのコントリビューションガイドは索引されていません
評価
この issue はまだ評価されていません。