Skip to content

Commit 074d9c2

Browse files
committed
feat(wip): add ecs
1 parent ec5ae04 commit 074d9c2

File tree

6 files changed

+50
-53
lines changed

6 files changed

+50
-53
lines changed

books/hands-on-rust/dungeoncrawl/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ edition = "2021"
77

88
[dependencies]
99
bracket-lib = "~0.8.1"
10+
legion = "=0.3.1"
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
pub use crate::prelude::*;
2+
3+
#[derive(Clone, Copy, Debug, PartialEq)]
4+
pub struct Render {
5+
pub color: ColorPair,
6+
pub glyph: FontCharType,
7+
}
8+
9+
#[derive(Clone, Copy, Debug, PartialEq)]
10+
pub struct Player;

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

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,45 @@
11
mod camera;
2+
mod components;
23
mod map;
34
mod map_builder;
4-
mod player;
5+
mod spawner;
6+
mod systems;
57
mod prelude {
68
pub use bracket_lib::prelude::*;
9+
pub use legion::systems::CommandBuffer;
10+
pub use legion::world::SubWorld;
11+
pub use legion::*;
712
pub const SCREEN_WIDTH: i32 = 80;
813
pub const SCREEN_HEIGHT: i32 = 50;
14+
pub const DISPLAY_WIDTH: i32 = SCREEN_WIDTH / 2;
15+
pub const DISPLAY_HEIGHT: i32 = SCREEN_HEIGHT / 2;
916
pub use crate::camera::*;
17+
pub use crate::components::*;
1018
pub use crate::map::*;
1119
pub use crate::map_builder::*;
12-
pub use crate::player::*;
13-
pub const DISPLAY_WIDTH: i32 = SCREEN_WIDTH / 2;
14-
pub const DISPLAY_HEIGHT: i32 = SCREEN_HEIGHT / 2;
20+
pub use crate::spawner::*;
21+
pub use crate::systems::*;
1522
}
1623

1724
use prelude::*;
1825

1926
struct State {
20-
map: Map,
21-
player: Player,
22-
camera: Camera,
27+
ecs: World,
28+
systems: Schedule,
2329
}
2430

2531
impl State {
2632
fn new() -> Self {
33+
let mut ecs = World::default();
34+
let mut resources = Resources::default();
2735
let mut rng = RandomNumberGenerator::new();
2836
let map_builder = MapBuilder::new(&mut rng);
37+
spawn_player(&mut ecs, map_builder.player_start);
38+
resources.insert(map_builder.map);
39+
resources.insert(Camera::new(map_builder.player_start));
2940
Self {
30-
map: map_builder.map,
31-
player: Player::new(map_builder.player_start),
32-
camera: Camera::new(map_builder.player_start),
41+
ecs,
42+
systems: build_scheduler(),
3343
}
3444
}
3545
}
@@ -40,9 +50,8 @@ impl GameState for State {
4050
ctx.cls();
4151
ctx.set_active_console(1);
4252
ctx.cls();
43-
self.player.update(ctx, &self.map, &mut self.camera);
44-
self.map.render(ctx, &self.camera);
45-
self.player.render(ctx, &self.camera);
53+
self.resources.insert(ctx.key);
54+
self.systems.execute(&mut self.ecs, &mut self.resources);
4655
}
4756
}
4857

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

Lines changed: 0 additions & 40 deletions
This file was deleted.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
use crate::prelude::*;
2+
3+
pub fn spawn_player(ecs: &mut World, pos: Point) {
4+
ecs.push((
5+
Player,
6+
pos,
7+
Render {
8+
color: ColorPair::new(WHITE, BLACK),
9+
glyph: to_cp437('@'),
10+
},
11+
));
12+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
use crate::prelude::*;
2+
3+
pub fn build_scheduler() -> Schedule {
4+
Schedule::builder().build()
5+
}

0 commit comments

Comments
 (0)