main.rs 2.7 KB

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