collisions

This commit is contained in:
unintendedfraud
2024-02-03 14:24:30 +01:00
parent 689a8d4176
commit d19770117a
5 changed files with 59 additions and 11 deletions
+3
View File
@@ -8,3 +8,6 @@ pub struct Render {
#[derive(Clone, Debug, Copy, PartialEq)]
pub struct Player;
#[derive(Clone, Debug, Copy, PartialEq)]
pub struct Ennemy;
+15 -8
View File
@@ -1,20 +1,20 @@
mod map;
mod map_builder;
mod camera;
mod components;
mod map;
mod map_builder;
mod spawner;
mod systems;
mod prelude {
pub use bracket_lib::prelude::*;
pub use legion::*;
pub use legion::world::SubWorld;
pub use legion::systems::CommandBuffer;
pub use legion::world::SubWorld;
pub use legion::*;
pub use crate::map::*;
pub use crate::map_builder::*;
pub use crate::camera::*;
pub use crate::components::*;
pub use crate::map::*;
pub use crate::map_builder::*;
pub use crate::spawner::*;
pub use crate::systems::*;
@@ -42,11 +42,18 @@ impl State {
let mut rng = RandomNumberGenerator::new();
let map_builder = MapBuilder::new(&mut rng);
spawn_player(&mut ecs, map_builder.player_start);
map_builder
.rooms
.iter()
.skip(1)
.map(|r| r.center())
.for_each(|pos| spawn_monster(&mut ecs, &mut rng, pos));
resources.insert(map_builder.map);
resources.insert(Camera::new(map_builder.player_start));
spawn_player(&mut ecs, map_builder.player_start);
return Self {
ecs,
resources,
+16
View File
@@ -10,3 +10,19 @@ pub fn spawn_player(ecs: &mut World, pos: Point) {
},
));
}
pub fn spawn_monster(ecs: &mut World, rng: &mut RandomNumberGenerator, pos: Point) {
ecs.push((
Ennemy,
pos,
Render {
color: ColorPair::new(WHITE, BLACK),
glyph: match rng.range(0, 4) {
0 => to_cp437('E'),
1 => to_cp437('O'),
2 => to_cp437('o'),
_ => to_cp437('G'),
},
},
));
}
+20
View File
@@ -0,0 +1,20 @@
use crate::prelude::*;
#[system]
#[read_component(Point)]
#[read_component(Player)]
#[read_component(Ennemy)]
pub fn collisions(ecs: &mut SubWorld, commands: &mut CommandBuffer) {
let mut player_position = Point::zero();
let mut players = <&Point>::query().filter(component::<Player>());
players.iter(ecs).for_each(|pos| player_position = *pos);
let mut ennemies = <(Entity, &Point)>::query().filter(component::<Ennemy>());
ennemies
.iter(ecs)
.filter(|(_, pos)| **pos == player_position)
.for_each(|(entity, _)| {
commands.remove(*entity);
});
}
+2
View File
@@ -1,12 +1,14 @@
mod player_input;
mod map_render;
mod entity_render;
mod collisions;
pub use crate::prelude::*;
pub fn build_scheduler() -> Schedule {
return Schedule::builder()
.add_system(player_input::player_input_system())
.add_system(collisions::collisions_system())
.add_system(map_render::map_render_system())
.add_system(entity_render::entity_render_system())
.build();