Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FAQ for common scenarios #623

Open
dakom opened this issue Aug 7, 2019 · 6 comments
Open

FAQ for common scenarios #623

dakom opened this issue Aug 7, 2019 · 6 comments

Comments

@dakom
Copy link

dakom commented Aug 7, 2019

Just having a bit of trouble understanding the API... the tutorial and cargo docs are great but I feel I need to do a bit of head-scratching to figure out some things like this:

  • how to get all entities that have a certain component?
  • how to get all entities that do not have a certain component?
  • how to get a specific component from an entity?
  • can I have multiple dispatchers (e.g. to run at different frequencies)?
  • if I'm not using parallel, should I use dispatchers anyway if I have multiple systems?
  • can entities have multiple instances of the same component (like two Transforms) ?

Maybe there can be a FAQ style page in the docs that asks and answers these (and more)...

@dakom
Copy link
Author

dakom commented Aug 7, 2019

Gonna try and answer some of my own questions:

how to get all entities that have a certain component?
how to get all entities that do not have a certain component?

Both of these are the same: call join() with the entities and component storage.

Inside of a system, use SystemData to get each of those (this is detailed in the docs).
Outside of a system, use world directly:

 let parents = world.read_storage::<Parent>();

 //all the root nodes, i.e. entities that don't have parent components
 for (entity, _) in (&world.entities(), !&parents).join() {
 }

 //all the children, i.e. entities that *have* parent components
 for (entity, parent) in (&world.entities(), &parents).join() { 
 }

how to get a specific component from an entity?

entities are used as keys in a component storage lookup. example:

world.read_storage::<Parent>().get(entity)

Don't know the answers to the other questions yet...

@WaDelma
Copy link
Member

WaDelma commented Aug 7, 2019

Nothing stops you from having multiple dispatchers.

You can only have one of each type of component for single entity.

@dakom
Copy link
Author

dakom commented Aug 7, 2019

thanks! btw by "not using parallel" I mean the Cargo feature :)

@arlyon
Copy link

arlyon commented Aug 19, 2019

Here's an interesting one: how do I add a components to all entities that don't have a given component? This, for example doesn't work due to the borrow checker:

for (entity, entity_position, ()) in (&entities, &positions, !&transforms).join() {
    let mut t = Transform::default();
    t.set_translation_xyz(0.0, 0.0, 0.0);
    transforms.insert(entity, t).unwrap();
}
error[E0502]: cannot borrow `transforms` as mutable because it is also borrowed as immutable
   --> src/systems.rs:169:13
    |
166 |         for (entity, entity_position, ()) in (&entities, &positions, !&transforms).join() {
    |                                              --------------------------------------------
    |                                              |                        |
    |                                              |                        immutable borrow occurs here
    |                                              immutable borrow later used here
...
169 |             transforms.insert(entity, t).unwrap();
    |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mutable borrow occurs here

willglynn pushed a commit to willglynn/specs that referenced this issue Aug 24, 2019
537: Update rand requirement from 0.5.5 to 0.6.1 r=torkleyy a=dependabot[bot]

Updates the requirements on [rand](https://github.com/rust-random/rand) to permit the latest version.
<details>
<summary>Changelog</summary>

*Sourced from [rand's changelog](https://github.com/rust-random/rand/blob/master/CHANGELOG.md).*

> ## [0.6.1] - 2018-11-22
> - Support sampling `Duration` also for `no_std` (only since Rust 1.25) ([amethyst#649](https://github-redirect.dependabot.com/rust-random/rand/issues/649))
> - Disable default features of `libc` ([amethyst#647](https://github-redirect.dependabot.com/rust-random/rand/issues/647))
> 
> ## [0.6.0] - 2018-11-14
> 
> ### Project organisation
> - Rand has moved from [rust-lang-nursery](https://github.com/rust-lang-nursery/rand)
>   to [rust-random](https://github.com/rust-random/rand)! ([amethyst#578](https://github-redirect.dependabot.com/rust-random/rand/issues/578))
> - Created [The Rust Random Book](https://rust-random.github.io/book/)
>   ([source](https://github.com/rust-random/book))
> - Update copyright and licence notices ([amethyst#591](https://github-redirect.dependabot.com/rust-random/rand/issues/591), [amethyst#611](https://github-redirect.dependabot.com/rust-random/rand/issues/611))
> - Migrate policy documentation from the wiki ([amethyst#544](https://github-redirect.dependabot.com/rust-random/rand/issues/544))
> 
> ### Platforms
> - Add fork protection on Unix ([amethyst#466](https://github-redirect.dependabot.com/rust-random/rand/issues/466))
> - Added support for wasm-bindgen. ([amethyst#541](https://github-redirect.dependabot.com/rust-random/rand/issues/541), [amethyst#559](https://github-redirect.dependabot.com/rust-random/rand/issues/559), [amethyst#562](https://github-redirect.dependabot.com/rust-random/rand/issues/562), [amethyst#600](https://github-redirect.dependabot.com/rust-random/rand/issues/600))
> - Enable `OsRng` for powerpc64, sparc and sparc64 ([amethyst#609](https://github-redirect.dependabot.com/rust-random/rand/issues/609))
> - Use `syscall` from `libc` on Linux instead of redefining it ([amethyst#629](https://github-redirect.dependabot.com/rust-random/rand/issues/629))
> 
> ### RNGs
> - Switch `SmallRng` to use PCG ([amethyst#623](https://github-redirect.dependabot.com/rust-random/rand/issues/623))
> - Implement `Pcg32` and `Pcg64Mcg` generators ([amethyst#632](https://github-redirect.dependabot.com/rust-random/rand/issues/632))
> - Move ISAAC RNGs to a dedicated crate ([amethyst#551](https://github-redirect.dependabot.com/rust-random/rand/issues/551))
> - Move Xorshift RNG to its own crate ([amethyst#557](https://github-redirect.dependabot.com/rust-random/rand/issues/557))
> - Move ChaCha and HC128 RNGs to dedicated crates ([amethyst#607](https://github-redirect.dependabot.com/rust-random/rand/issues/607), [amethyst#636](https://github-redirect.dependabot.com/rust-random/rand/issues/636))
> - Remove usage of `Rc` from `ThreadRng` ([amethyst#615](https://github-redirect.dependabot.com/rust-random/rand/issues/615))
> 
> ### Sampling and distributions
> - Implement `Rng.gen_ratio()` and `Bernoulli::new_ratio()` ([amethyst#491](https://github-redirect.dependabot.com/rust-random/rand/issues/491))
> - Make `Uniform` strictly respect `f32` / `f64` high/low bounds ([amethyst#477](https://github-redirect.dependabot.com/rust-random/rand/issues/477))
> - Allow `gen_range` and `Uniform` to work on non-`Copy` types ([amethyst#506](https://github-redirect.dependabot.com/rust-random/rand/issues/506))
> - `Uniform` supports inclusive ranges: `Uniform::from(a..=b)`. This is
>   automatically enabled for Rust >= 1.27. ([amethyst#566](https://github-redirect.dependabot.com/rust-random/rand/issues/566))
> - Implement `TrustedLen` and `FusedIterator` for `DistIter` ([amethyst#620](https://github-redirect.dependabot.com/rust-random/rand/issues/620))
> 
> #### New distributions
> - Add the `Dirichlet` distribution ([amethyst#485](https://github-redirect.dependabot.com/rust-random/rand/issues/485))
> - Added sampling from the unit sphere and circle. ([amethyst#567](https://github-redirect.dependabot.com/rust-random/rand/issues/567))
> - Implement the triangular distribution ([amethyst#575](https://github-redirect.dependabot.com/rust-random/rand/issues/575))
> - Implement the Weibull distribution ([amethyst#576](https://github-redirect.dependabot.com/rust-random/rand/issues/576))
> - Implement the Beta distribution ([amethyst#574](https://github-redirect.dependabot.com/rust-random/rand/issues/574))
> 
> #### Optimisations
> 
> - Optimise `Bernoulli::new` ([amethyst#500](https://github-redirect.dependabot.com/rust-random/rand/issues/500))
> - Optimise `char` sampling ([amethyst#519](https://github-redirect.dependabot.com/rust-random/rand/issues/519))
> - Optimise sampling of `std::time::Duration` ([amethyst#583](https://github-redirect.dependabot.com/rust-random/rand/issues/583))
> 
> ### Sequences
></table> ... (truncated)
</details>
<details>
<summary>Commits</summary>

- See full diff in [compare view](https://github.com/rust-random/rand/commits/0.6.1)
</details>
<br />

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

**Note:** This repo was added to Dependabot recently, so you'll receive a maximum of 5 PRs for your first few update runs. Once an update run creates fewer than 5 PRs we'll remove that limit.

You can always request more updates by clicking `Bump now` in your [Dependabot dashboard](https://app.dependabot.com).

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot ignore this [patch|minor|major] version` will close this PR and stop Dependabot creating any more for this minor/major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language
- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language
- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language
- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language
- `@dependabot badge me` will comment on this PR with code to add a "Dependabot enabled" badge to your readme

Additionally, you can set the following in your Dependabot [dashboard](https://app.dependabot.com):
- Update frequency (including time of day and day of week)
- Automerge options (never/patch/minor, and dev/runtime dependencies)
- Pull request limits (per update run and/or open at any time)
- Out-of-range updates (receive only lockfile updates, if desired)
- Security updates (receive only security updates, if desired)

Finally, you can contact us by mentioning @dependabot.

</details>



Co-authored-by: dependabot[bot] <support@dependabot.com>
Co-authored-by: Thomas Schaller <torkleyy@gmail.com>
@willglynn
Copy link
Contributor

@arlyon I would reach for LazyUpdate::insert() here.

@drmorr0
Copy link

drmorr0 commented Mar 14, 2020

Is there a way to get all components attached to a given entity?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants