main.rs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #[macro_use] extern crate specs_derive;
  2. use ggez::{Context, GameError, event::EventHandler};
  3. use specs::prelude::*;
  4. #[derive(Component)]
  5. struct Pos {
  6. x: usize,
  7. y: usize,
  8. }
  9. #[derive(Component)]
  10. struct Renderable {
  11. glyph: u8,
  12. color: carpet::Color,
  13. }
  14. struct Draw;
  15. impl<'a> System<'a> for Draw {
  16. type SystemData = (
  17. ReadStorage<'a, Pos>,
  18. ReadStorage<'a, Renderable>,
  19. WriteExpect<'a, carpet::Board>,
  20. );
  21. fn run(&mut self, (pos, renderable, mut board): Self::SystemData) {
  22. board.clear();
  23. for (p, r) in (&pos, &renderable).join() {
  24. board.set_with_color([p.x, p.y], r.glyph, r.color);
  25. }
  26. }
  27. }
  28. #[derive(Component)]
  29. struct MoveLeft;
  30. impl<'a> System<'a> for MoveLeft {
  31. type SystemData = (
  32. ReadStorage<'a, MoveLeft>,
  33. WriteStorage<'a, Pos>,
  34. );
  35. fn run(&mut self, (left, mut pos): Self::SystemData) {
  36. for (_, p) in (&left, &mut pos).join() {
  37. if p.x == 0 {
  38. p.x = 79;
  39. } else {
  40. p.x -= 1;
  41. }
  42. }
  43. }
  44. }
  45. struct State {
  46. world: World,
  47. }
  48. impl EventHandler for State {
  49. fn draw(&mut self, ctx: &mut Context) -> Result<(), GameError> {
  50. ggez::graphics::clear(ctx, ggez::graphics::BLACK);
  51. self.world.fetch::<carpet::Board>().draw(ctx)?;
  52. ggez::graphics::present(ctx)
  53. }
  54. fn update(&mut self, _ctx: &mut Context) -> Result<(), GameError> {
  55. Draw.run_now(&mut self.world);
  56. MoveLeft.run_now(&mut self.world);
  57. Ok(())
  58. }
  59. }
  60. fn main() -> Result<(), GameError> {
  61. let (mut ctx, mut evloop) = ggez::ContextBuilder::new("game", "me")
  62. .add_resource_path({
  63. let base = std::env::var("CARGO_MANIFEST_DIR").unwrap();
  64. let mut path = std::path::PathBuf::from(base);
  65. path.push("resources");
  66. path
  67. })
  68. .window_mode(ggez::conf::WindowMode {
  69. width: 80.0 * 8.0,
  70. height: 50.0 * 8.0,
  71. ..ggez::conf::WindowMode::default()
  72. })
  73. .build()?;
  74. let mut world = World::new();
  75. world.register::<Pos>();
  76. world.register::<Renderable>();
  77. world.register::<MoveLeft>();
  78. let tileset = carpet::Tileset::from_file(&mut ctx, [8,8], "/terminal8x8.jpg")?;
  79. let mut board = carpet::Board::new([80,50], tileset);
  80. board.print([1, 1], "Hello, world!");
  81. world
  82. .create_entity()
  83. .with(Pos { x: 40, y: 25 })
  84. .with(Renderable {
  85. glyph: 'A' as u8,
  86. color: carpet::Color::Blue,
  87. })
  88. .build();
  89. for i in 0..10 {
  90. world
  91. .create_entity()
  92. .with(Pos { x: i * 7, y: 20 })
  93. .with(Renderable {
  94. glyph: 'X' as u8,
  95. color: carpet::Color::Red,
  96. })
  97. .with(MoveLeft)
  98. .build();
  99. }
  100. world.insert(board);
  101. let mut state = State { world };
  102. ggez::event::run(&mut ctx, &mut evloop, &mut state)
  103. }