Browse Source

Turn renderable drawing into a system

Getty Ritter 4 years ago
parent
commit
161bc3ae6e
2 changed files with 27 additions and 11 deletions
  1. 25 0
      chapter-07-damage/src/draw_system.rs
  2. 2 11
      chapter-07-damage/src/main.rs

+ 25 - 0
chapter-07-damage/src/draw_system.rs

@@ -0,0 +1,25 @@
+use rltk::{Console, Rltk};
+use specs::{Join, ReadStorage, ReadExpect, System};
+use crate::components::{Position, Renderable};
+use crate::map::Map;
+
+pub struct DrawRenderables<'r> {
+    pub ctx: &'r mut Rltk,
+}
+
+impl<'a, 'r> System<'a> for DrawRenderables<'r> {
+    type SystemData = (
+        ReadStorage<'a, Position>,
+        ReadStorage<'a, Renderable>,
+        ReadExpect<'a, Map>,
+    );
+
+    fn run(&mut self, (positions, renderables, map): Self::SystemData) {
+        for (pos, render) in (&positions, &renderables).join() {
+            let idx = map.xy_idx(pos.x, pos.y);
+            if map.visible_tiles[idx] {
+                self.ctx.set(pos.x, pos.y, render.fg, render.bg, render.glyph);
+            }
+        }
+    }
+}

+ 2 - 11
chapter-07-damage/src/main.rs

@@ -12,6 +12,7 @@ mod player;
 use player::*;
 mod rect;
 pub use rect::Rect;
+mod draw_system;
 mod visibility_system;
 use visibility_system::VisibilitySystem;
 mod monster_ai_system;
@@ -74,17 +75,7 @@ impl GameState for State {
         damage_system::CleanupDead.run_now(&self.ecs);
 
         draw_map(&self.ecs, ctx);
-
-        let positions = self.ecs.read_storage::<Position>();
-        let renderables = self.ecs.read_storage::<Renderable>();
-        let map = self.ecs.fetch::<Map>();
-
-        for (pos, render) in (&positions, &renderables).join() {
-            let idx = map.xy_idx(pos.x, pos.y);
-            if map.visible_tiles[idx] {
-                ctx.set(pos.x, pos.y, render.fg, render.bg, render.glyph)
-            }
-        }
+        draw_system::DrawRenderables { ctx }.run_now(&self.ecs);
     }
 }