main.rs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. extern crate rltk;
  2. use rltk::{Console, GameState, Rltk, RGB};
  3. extern crate specs;
  4. use specs::prelude::*;
  5. #[macro_use]
  6. extern crate specs_derive;
  7. mod components;
  8. pub use components::*;
  9. mod map;
  10. pub use map::*;
  11. mod player;
  12. use player::*;
  13. mod rect;
  14. pub use rect::Rect;
  15. mod visibility_system;
  16. use visibility_system::VisibilitySystem;
  17. pub struct State {
  18. pub ecs: World,
  19. pub systems: Dispatcher<'static, 'static>
  20. }
  21. impl GameState for State {
  22. fn tick(&mut self, ctx : &mut Rltk) {
  23. ctx.cls();
  24. player_input(self, ctx);
  25. self.systems.dispatch(&self.ecs);
  26. draw_map(&self.ecs, ctx);
  27. let positions = self.ecs.read_storage::<Position>();
  28. let renderables = self.ecs.read_storage::<Renderable>();
  29. for (pos, render) in (&positions, &renderables).join() {
  30. ctx.set(pos.x, pos.y, render.fg, render.bg, render.glyph);
  31. }
  32. }
  33. }
  34. fn main() {
  35. let context = Rltk::init_simple8x8(80, 50, "Hello Rust World", "../resources");
  36. let mut gs = State {
  37. ecs: World::new(),
  38. systems : DispatcherBuilder::new()
  39. .with(VisibilitySystem{}, "visibility_system", &[])
  40. .build()
  41. };
  42. gs.ecs.register::<Position>();
  43. gs.ecs.register::<Renderable>();
  44. gs.ecs.register::<Player>();
  45. gs.ecs.register::<Viewshed>();
  46. let map : Map = Map::new_map_rooms_and_corridors();
  47. let (player_x, player_y) = map.rooms[0].center();
  48. gs.ecs.insert(map);
  49. gs.ecs
  50. .create_entity()
  51. .with(Position { x: player_x, y: player_y })
  52. .with(Renderable {
  53. glyph: rltk::to_cp437('@'),
  54. fg: RGB::named(rltk::YELLOW),
  55. bg: RGB::named(rltk::BLACK),
  56. })
  57. .with(Player{})
  58. .with(Viewshed{ visible_tiles : Vec::new(), range: 8, dirty: true })
  59. .build();
  60. rltk::main_loop(context, gs);
  61. }