main.rs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. rltk::add_wasm_support!();
  18. pub struct State {
  19. pub ecs: World
  20. }
  21. impl State {
  22. fn run_systems(&mut self) {
  23. let mut vis = VisibilitySystem{};
  24. vis.run_now(&self.ecs);
  25. self.ecs.maintain();
  26. }
  27. }
  28. impl GameState for State {
  29. fn tick(&mut self, ctx : &mut Rltk) {
  30. ctx.cls();
  31. player_input(self, ctx);
  32. self.run_systems();
  33. draw_map(&self.ecs, ctx);
  34. let positions = self.ecs.read_storage::<Position>();
  35. let renderables = self.ecs.read_storage::<Renderable>();
  36. for (pos, render) in (&positions, &renderables).join() {
  37. ctx.set(pos.x, pos.y, render.fg, render.bg, render.glyph);
  38. }
  39. }
  40. }
  41. fn main() {
  42. let context = Rltk::init_simple8x8(80, 50, "Hello Rust World", "resources");
  43. let mut gs = State {
  44. ecs: World::new()
  45. };
  46. gs.ecs.register::<Position>();
  47. gs.ecs.register::<Renderable>();
  48. gs.ecs.register::<Player>();
  49. gs.ecs.register::<Viewshed>();
  50. let map : Map = Map::new_map_rooms_and_corridors();
  51. let (player_x, player_y) = map.rooms[0].center();
  52. gs.ecs.insert(map);
  53. gs.ecs
  54. .create_entity()
  55. .with(Position { x: player_x, y: player_y })
  56. .with(Renderable {
  57. glyph: rltk::to_cp437('@'),
  58. fg: RGB::named(rltk::YELLOW),
  59. bg: RGB::named(rltk::BLACK),
  60. })
  61. .with(Player{})
  62. .with(Viewshed{ visible_tiles : Vec::new(), range: 8, dirty: true })
  63. .build();
  64. rltk::main_loop(context, gs);
  65. }