main.rs 1.6 KB

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