main.rs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #[macro_use]
  2. extern crate specs_derive;
  3. #[macro_use]
  4. extern crate specs_system_macro;
  5. use ggez::GameError;
  6. use specs::prelude::*;
  7. #[derive(Component)]
  8. pub struct Pos {
  9. x: usize,
  10. y: usize,
  11. }
  12. #[derive(Component)]
  13. pub struct Renderable {
  14. glyph: carpet::CP437,
  15. color: carpet::Color,
  16. }
  17. #[derive(Component)]
  18. pub struct MoveLeft;
  19. #[derive(Component)]
  20. pub struct Player;
  21. #[derive(Component)]
  22. pub struct Motion {
  23. down: i8,
  24. right: i8,
  25. }
  26. system_impl! {
  27. Draw(
  28. resource mut board: carpet::Board<carpet::CP437>,
  29. renderable: Renderable,
  30. pos: Pos,
  31. ) {
  32. board.clear();
  33. for (p, r) in (&pos, &renderable).join() {
  34. board.set_with_color([p.x, p.y], r.glyph, r.color);
  35. }
  36. }
  37. }
  38. system! {
  39. Leftward (
  40. _left: MoveLeft,
  41. mut pos: Pos,
  42. ) {
  43. if pos.x == 0 {
  44. pos.x = 79;
  45. } else {
  46. pos.x -= 1;
  47. }
  48. }
  49. }
  50. system! {
  51. Move (
  52. mut motion: Motion,
  53. mut pos: Pos,
  54. ) {
  55. pos.x = (pos.x as i8 + motion.right) as usize;
  56. pos.y = (pos.y as i8 + motion.down) as usize;
  57. } finally {
  58. motion.clear();
  59. }
  60. }
  61. fn main() -> Result<(), GameError> {
  62. let mut game = carpet::GameBuilder::new()
  63. .name("game")
  64. .author("me")
  65. .resource_path({
  66. let base = std::env::var("CARGO_MANIFEST_DIR").unwrap();
  67. let mut path = std::path::PathBuf::from(base);
  68. path.push("resources");
  69. path
  70. })
  71. .tileset("/terminal8x8.jpg", [8, 8])
  72. .map_size(80, 50)
  73. .build()?;
  74. game.register::<Pos>();
  75. game.register::<Renderable>();
  76. game.register::<MoveLeft>();
  77. game.register::<Motion>();
  78. game.register::<Player>();
  79. game.world.print([1, 1], "Hello, world!");
  80. game.create_entity()
  81. .with(Pos { x: 40, y: 25 })
  82. .with(Player)
  83. .with(Renderable {
  84. glyph: carpet::CP437::from_char('A'),
  85. color: carpet::Color::Blue,
  86. })
  87. .build();
  88. for i in 0..10 {
  89. game.create_entity()
  90. .with(Pos { x: i * 7, y: 20 })
  91. .with(Renderable {
  92. glyph: carpet::CP437::from_char('X'),
  93. color: carpet::Color::Red,
  94. })
  95. .with(MoveLeft)
  96. .build();
  97. }
  98. game.on_key((carpet::VirtualKeyCode::W, carpet::KeyMods::NONE), |world| {
  99. let player = (&world.read_component::<Player>(), &world.entities()).join().next().unwrap().1;
  100. world.write_component::<Motion>().insert(player, Motion { down: -1, right: 0 }).unwrap();
  101. });
  102. game.on_key((carpet::VirtualKeyCode::A, carpet::KeyMods::NONE), |world| {
  103. let player = (&world.read_component::<Player>(), &world.entities()).join().next().unwrap().1;
  104. world.write_component::<Motion>().insert(player, Motion { down: 0, right: -1 }).unwrap();
  105. });
  106. game.on_key((carpet::VirtualKeyCode::S, carpet::KeyMods::NONE), |world| {
  107. let player = (&world.read_component::<Player>(), &world.entities()).join().next().unwrap().1;
  108. world.write_component::<Motion>().insert(player, Motion { down: 1, right: 0 }).unwrap();
  109. });
  110. game.on_key((carpet::VirtualKeyCode::D, carpet::KeyMods::NONE), |world| {
  111. let player = (&world.read_component::<Player>(), &world.entities()).join().next().unwrap().1;
  112. world.write_component::<Motion>().insert(player, Motion { down: 0, right: 1 }).unwrap();
  113. });
  114. game.run_with_systems(|world| {
  115. Draw.run_now(&world);
  116. Leftward.run_now(&world);
  117. Move.run_now(&world);
  118. })
  119. }