main.rs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #[macro_use]
  2. extern crate specs_derive;
  3. #[macro_use]
  4. extern crate specs_system_macro;
  5. mod components;
  6. mod map;
  7. mod systems;
  8. use ggez::GameError;
  9. use specs::prelude::{Builder, RunNow};
  10. use components as com;
  11. fn main() -> Result<(), GameError> {
  12. let mut game: carpet::Game<carpet::CP437> = carpet::GameBuilder::new()
  13. .name("game")
  14. .author("me")
  15. .resource_path({
  16. let base = std::env::var("CARGO_MANIFEST_DIR").unwrap();
  17. let mut path = std::path::PathBuf::from(base);
  18. path.pop();
  19. path.push("resources");
  20. path
  21. })
  22. .tileset("/haberdash.gif", [12, 12])
  23. .map_size(80, 50)
  24. .build()?;
  25. game.register::<carpet::Coord>();
  26. game.register::<com::Renderable>();
  27. game.register::<com::Motion>();
  28. game.register::<com::Player>();
  29. let map = map::Map::new();
  30. let player_start = map
  31. .rooms
  32. .first()
  33. .map(|r| r.center())
  34. .unwrap_or([40, 25].into());
  35. game.insert(map);
  36. game.create_entity()
  37. .with(player_start)
  38. .with(com::Player)
  39. .with(com::Renderable {
  40. glyph: carpet::CP437::from_char('@'),
  41. color: carpet::Color::Blue,
  42. })
  43. .build();
  44. {
  45. // set up all the keybindings
  46. use carpet::VirtualKeyCode::*;
  47. let none = carpet::KeyMods::NONE;
  48. game.on_key((W, none), |world| com::Motion::move_player(world, -1, 0));
  49. game.on_key((A, none), |world| com::Motion::move_player(world, 0, -1));
  50. game.on_key((S, none), |world| com::Motion::move_player(world, 1, 0));
  51. game.on_key((D, none), |world| com::Motion::move_player(world, 0, 1));
  52. }
  53. game.run_with_systems(|world| {
  54. systems::Draw.run_now(&world);
  55. systems::Move.run_now(&world);
  56. })
  57. }