Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

66 Zeilen
1.7 KiB

  1. use specs::{
  2. saveload::MarkedBuilder, world::EntitiesRes, Builder, Entity, LazyUpdate, World, WorldExt,
  3. WriteStorage,
  4. };
  5. use glc::vector::Vector2f;
  6. use crate::{
  7. components::{MeetingPoint, Position},
  8. misc::{Persistence, WorldPersistence},
  9. };
  10. use super::Error;
  11. #[derive(Default, Clone)]
  12. pub struct MeetingPointBuilder {
  13. position: Option<Vector2f>,
  14. }
  15. impl MeetingPointBuilder {
  16. pub fn build(&self, world: &mut World) -> Result<Entity, Error> {
  17. let position = self.position.ok_or(Error::MissingValue("position"))?;
  18. let position = Position::new(position);
  19. let meeting_point = MeetingPoint::new(0.0, 10.0);
  20. let entity = world
  21. .create_entity()
  22. .marked::<<WorldPersistence as Persistence>::Marker>()
  23. .with(position)
  24. .with(meeting_point)
  25. .build();
  26. Ok(entity)
  27. }
  28. pub fn lazy(
  29. &self,
  30. lazy: &LazyUpdate,
  31. entities: &EntitiesRes,
  32. positions: &mut WriteStorage<'_, Position>,
  33. meeting_points: &mut WriteStorage<'_, MeetingPoint>,
  34. ) -> Result<Entity, Error> {
  35. let position = self.position.ok_or(Error::MissingValue("position"))?;
  36. let position = Position::new(position);
  37. let meeting_point = MeetingPoint::new(0.0, 10.0);
  38. let entity = lazy
  39. .create_entity(entities)
  40. .marked::<<WorldPersistence as Persistence>::Marker>()
  41. .build();
  42. positions.insert(entity, position)?;
  43. meeting_points.insert(entity, meeting_point)?;
  44. Ok(entity)
  45. }
  46. pub fn position<V: Into<Vector2f>>(mut self, value: V) -> Self {
  47. self.position = Some(value.into());
  48. self
  49. }
  50. }