Advertisement
Guest User

Untitled

a guest
Jul 19th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.13 KB | None | 0 0
  1. use amethyst::ecs::{
  2. world::{EntitiesRes, EntityResBuilder},
  3. Entity, EntityBuilder, Read, WriteStorage,
  4. };
  5. use amethyst::prelude::*;
  6. use amethyst::utils::removal::{exec_removal, Removal};
  7.  
  8. #[derive(Default)]
  9. pub struct ManagedResource {
  10. active_state: usize,
  11. }
  12.  
  13. impl ManagedResource {
  14. fn push_state(&mut self) {
  15. self.active_state += 1;
  16. }
  17.  
  18. fn pop_state(&mut self) -> usize {
  19. assert!(self.active_state > 0);
  20. let prev_state = self.active_state;
  21. self.active_state -= 1;
  22.  
  23. prev_state
  24. }
  25. }
  26.  
  27. pub trait ManagedWorld {
  28. fn create_managed_entity(&mut self) -> EntityBuilder;
  29. fn push_state(&mut self);
  30. fn pop_state(&mut self);
  31. fn reset_state(&mut self);
  32. }
  33.  
  34. impl ManagedWorld for World {
  35. fn create_managed_entity(&mut self) -> EntityBuilder {
  36. let active_state = self.read_resource::<ManagedResource>().active_state;
  37. self.create_entity().with(Removal::new(active_state))
  38. }
  39.  
  40. fn push_state(&mut self) {
  41. self.register::<Removal<usize>>();
  42. self.res
  43. .entry::<ManagedResource>()
  44. .or_insert_with(|| ManagedResource { active_state: 0 })
  45. .push_state();
  46. }
  47.  
  48. fn pop_state(&mut self) {
  49. let stale_state = self.write_resource::<ManagedResource>().pop_state();
  50. exec_removal(
  51. &self.entities(),
  52. &self.read_storage::<Removal<usize>>(),
  53. stale_state,
  54. );
  55. self.maintain();
  56. }
  57.  
  58. fn reset_state(&mut self) {
  59. self.pop_state();
  60. self.push_state();
  61. }
  62. }
  63.  
  64. #[allow(dead_code)]
  65. pub fn build_managed_entity<'a>(
  66. managed_resource: &Read<ManagedResource>,
  67. entities: &'a EntitiesRes,
  68. removal_storage: &mut WriteStorage<Removal<usize>>,
  69. ) -> EntityResBuilder<'a> {
  70. entities
  71. .build_entity()
  72. .with(Removal::new(managed_resource.active_state), removal_storage)
  73. }
  74.  
  75. #[allow(dead_code)]
  76. pub fn create_managed_entity(
  77. managed_resource: &Read<ManagedResource>,
  78. entities: &EntitiesRes,
  79. removal_storage: &mut WriteStorage<Removal<usize>>,
  80. ) -> Entity {
  81. build_managed_entity(managed_resource, entities, removal_storage).build()
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement