collisions
This commit is contained in:
@@ -8,3 +8,6 @@ pub struct Render {
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Copy, PartialEq)]
|
#[derive(Clone, Debug, Copy, PartialEq)]
|
||||||
pub struct Player;
|
pub struct Player;
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Copy, PartialEq)]
|
||||||
|
pub struct Ennemy;
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
mod map;
|
|
||||||
mod map_builder;
|
|
||||||
mod camera;
|
mod camera;
|
||||||
mod components;
|
mod components;
|
||||||
|
mod map;
|
||||||
|
mod map_builder;
|
||||||
mod spawner;
|
mod spawner;
|
||||||
mod systems;
|
mod systems;
|
||||||
|
|
||||||
mod prelude {
|
mod prelude {
|
||||||
pub use bracket_lib::prelude::*;
|
pub use bracket_lib::prelude::*;
|
||||||
pub use legion::*;
|
|
||||||
pub use legion::world::SubWorld;
|
|
||||||
pub use legion::systems::CommandBuffer;
|
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::camera::*;
|
||||||
pub use crate::components::*;
|
pub use crate::components::*;
|
||||||
|
pub use crate::map::*;
|
||||||
|
pub use crate::map_builder::*;
|
||||||
pub use crate::spawner::*;
|
pub use crate::spawner::*;
|
||||||
pub use crate::systems::*;
|
pub use crate::systems::*;
|
||||||
|
|
||||||
@@ -42,11 +42,18 @@ impl State {
|
|||||||
let mut rng = RandomNumberGenerator::new();
|
let mut rng = RandomNumberGenerator::new();
|
||||||
let map_builder = MapBuilder::new(&mut rng);
|
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(map_builder.map);
|
||||||
resources.insert(Camera::new(map_builder.player_start));
|
resources.insert(Camera::new(map_builder.player_start));
|
||||||
|
|
||||||
spawn_player(&mut ecs, map_builder.player_start);
|
|
||||||
|
|
||||||
return Self {
|
return Self {
|
||||||
ecs,
|
ecs,
|
||||||
resources,
|
resources,
|
||||||
|
|||||||
@@ -4,9 +4,25 @@ pub fn spawn_player(ecs: &mut World, pos: Point) {
|
|||||||
ecs.push((
|
ecs.push((
|
||||||
Player,
|
Player,
|
||||||
pos,
|
pos,
|
||||||
Render{
|
Render {
|
||||||
color: ColorPair::new(WHITE, BLACK),
|
color: ColorPair::new(WHITE, BLACK),
|
||||||
glyph: to_cp437('@'),
|
glyph: to_cp437('@'),
|
||||||
},
|
},
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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'),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -1,12 +1,14 @@
|
|||||||
mod player_input;
|
mod player_input;
|
||||||
mod map_render;
|
mod map_render;
|
||||||
mod entity_render;
|
mod entity_render;
|
||||||
|
mod collisions;
|
||||||
|
|
||||||
pub use crate::prelude::*;
|
pub use crate::prelude::*;
|
||||||
|
|
||||||
pub fn build_scheduler() -> Schedule {
|
pub fn build_scheduler() -> Schedule {
|
||||||
return Schedule::builder()
|
return Schedule::builder()
|
||||||
.add_system(player_input::player_input_system())
|
.add_system(player_input::player_input_system())
|
||||||
|
.add_system(collisions::collisions_system())
|
||||||
.add_system(map_render::map_render_system())
|
.add_system(map_render::map_render_system())
|
||||||
.add_system(entity_render::entity_render_system())
|
.add_system(entity_render::entity_render_system())
|
||||||
.build();
|
.build();
|
||||||
|
|||||||
Reference in New Issue
Block a user