draw_system.rs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. use crate::components::{Position, Renderable};
  2. use crate::map;
  3. use rltk::{Console, Rltk};
  4. use specs::{Join, ReadExpect, ReadStorage, System};
  5. pub struct DrawRenderables<'r> {
  6. pub ctx: &'r mut Rltk,
  7. }
  8. impl<'a, 'r> System<'a> for DrawRenderables<'r> {
  9. type SystemData = (
  10. ReadStorage<'a, Position>,
  11. ReadStorage<'a, Renderable>,
  12. ReadExpect<'a, map::Map>,
  13. );
  14. fn run(&mut self, (positions, renderables, map): Self::SystemData) {
  15. let points = iproduct!(0..map::MAPHEIGHT, 0..map::MAPWIDTH);
  16. for (idx, (tile, (y, x))) in map.tiles.iter().zip(points).enumerate() {
  17. // Render a tile depending upon the tile type
  18. if map.revealed_tiles[idx] {
  19. let fg = if map.visible_tiles[idx] {
  20. tile.color()
  21. } else {
  22. tile.color().to_greyscale()
  23. };
  24. self.ctx.set(
  25. x as i32,
  26. y as i32,
  27. fg,
  28. rltk::RGB::from_f32(0., 0., 0.),
  29. tile.glyph(),
  30. );
  31. }
  32. }
  33. for (pos, render) in (&positions, &renderables).join() {
  34. let idx = map.xy_idx(pos.x, pos.y);
  35. if map.visible_tiles[idx] {
  36. self.ctx
  37. .set(pos.x, pos.y, render.fg, render.bg, render.glyph);
  38. }
  39. }
  40. }
  41. }