Skip to content

Commit 799b6d1

Browse files
committed
feat(wip): add systems
1 parent 074d9c2 commit 799b6d1

File tree

5 files changed

+82
-1
lines changed

5 files changed

+82
-1
lines changed

books/hands-on-rust/dungeoncrawl/src/main.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ use prelude::*;
2525

2626
struct State {
2727
ecs: World,
28+
resources: Resources,
2829
systems: Schedule,
2930
}
3031

@@ -39,6 +40,7 @@ impl State {
3940
resources.insert(Camera::new(map_builder.player_start));
4041
Self {
4142
ecs,
43+
resources,
4244
systems: build_scheduler(),
4345
}
4446
}
@@ -52,6 +54,7 @@ impl GameState for State {
5254
ctx.cls();
5355
self.resources.insert(ctx.key);
5456
self.systems.execute(&mut self.ecs, &mut self.resources);
57+
render_draw_buffer(ctx).expect("Render error");
5558
}
5659
}
5760

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
use crate::prelude::*;
2+
3+
#[system]
4+
#[read_component(Point)]
5+
#[read_component(Render)]
6+
pub fn entity_render(ecs: &SubWorld, #[resource] camera: &Camera) {
7+
let mut draw_batch = DrawBatch::new();
8+
draw_batch.target(1);
9+
let offset = Point::new(camera.left_x, camera.top_y);
10+
11+
<(&Point, &Render)>::query()
12+
.iter(ecs)
13+
.for_each(|(pos, render)| {
14+
draw_batch.set(*pos - offset, render.color, render.glyph);
15+
});
16+
draw_batch.submit(5000).expect("Batch error");
17+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
use crate::prelude::*;
2+
3+
#[system]
4+
pub fn map_render(#[resource] map: &Map, #[resource] camera: &Camera) {
5+
let mut draw_batch = DrawBatch::new();
6+
draw_batch.target(0);
7+
for y in camera.top_y..=camera.bottom_y {
8+
for x in camera.left_x..camera.right_x {
9+
let pt = Point::new(x, y);
10+
let offset = Point::new(camera.left_x, camera.top_y);
11+
if map.in_bounds(pt) {
12+
let idx = map_idx(x, y);
13+
let glyph = match map.tiles[idx] {
14+
TileType::Floor => to_cp437('.'),
15+
TileType::Wall => to_cp437('#'),
16+
};
17+
draw_batch.set(pt - offset, ColorPair::new(WHITE, BLACK), glyph);
18+
}
19+
}
20+
}
21+
draw_batch.submit(0).expect("Batch error");
22+
}
Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
1+
mod entity_render;
2+
mod map_render;
3+
mod player_input;
14
use crate::prelude::*;
25

36
pub fn build_scheduler() -> Schedule {
4-
Schedule::builder().build()
7+
Schedule::builder()
8+
.add_system(player_input::player_input_system())
9+
.add_system(map_render::map_render_system())
10+
.add_system(entity_render::entity_render_system())
11+
.build()
512
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
use crate::prelude::*;
2+
3+
#[system]
4+
#[write_component(Point)]
5+
#[read_component(Player)]
6+
pub fn player_input(
7+
ecs: &mut SubWorld,
8+
#[resource] map: &Map,
9+
#[resource] key: &Option<VirtualKeyCode>,
10+
#[resource] camera: &mut Camera,
11+
) {
12+
if let Some(key) = key {
13+
let delta = match key {
14+
VirtualKeyCode::Left => Point::new(-1, 0),
15+
VirtualKeyCode::Right => Point::new(1, 0),
16+
VirtualKeyCode::Up => Point::new(0, -1),
17+
VirtualKeyCode::Down => Point::new(0, 1),
18+
_ => Point::new(0, 0),
19+
};
20+
21+
if delta.x != 0 || delta.y != 0 {
22+
let mut players = <&mut Point>::query().filter(component::<Player>());
23+
players.iter_mut(ecs).for_each(|pos| {
24+
let destination = *pos + delta;
25+
if map.can_enter_tile(destination) {
26+
*pos = destination;
27+
camera.on_player_move(destination);
28+
}
29+
});
30+
}
31+
}
32+
}

0 commit comments

Comments
 (0)