From 0de96c75933f49769e476a474efee4093007d9ee Mon Sep 17 00:00:00 2001 From: Alex Page Date: Wed, 26 Jan 2022 17:42:20 -0500 Subject: [PATCH] Track players and monsters as tiles for collision --- src/main.rs | 22 +++++++++++++++--- src/map.rs | 12 ++++++++++ src/systems/monster_motion.rs | 44 +++++++++++++++++++++++++---------- 3 files changed, 63 insertions(+), 15 deletions(-) diff --git a/src/main.rs b/src/main.rs index 2ce6038..c3d8a5d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -33,7 +33,7 @@ struct State { fn try_move_player(delta_x: i32, delta_y: i32, ecs: &mut World, sound_system: &mut SoundSystem) { let mut positions = ecs.write_storage::(); let mut players = ecs.write_storage::(); - let map = ecs.fetch::(); + let mut map = ecs.write_resource::(); for (player, pos) in (&mut players, &mut positions).join() { let now = Instant::now(); @@ -49,6 +49,9 @@ fn try_move_player(delta_x: i32, delta_y: i32, ecs: &mut World, sound_system: &m if map.is_solid(destination) { sound_system.play_sound(sound_effects.blocked.clone()); } else { + map.set_tile_at(Point { x: pos.x, y: pos.y }, TileType::Floor); + map.set_tile_at(destination, TileType::Player); + pos.x = destination.x; pos.y = destination.y; @@ -191,7 +194,7 @@ fn main() -> BError { gs.ecs.register::(); gs.ecs.register::(); - let map = Map::new(); + let mut map = Map::new(); let mut rng = RandomNumberGenerator::new(); for (i, tile) in &mut map.get_tiles().iter().enumerate() { if rng.roll_dice(1, 16) < 2 && *tile == TileType::Floor { @@ -215,7 +218,16 @@ fn main() -> BError { .build(); } } - gs.ecs.insert(map); + + { + let entities = gs.ecs.entities(); + let positions = gs.ecs.read_storage::(); + let monsters = gs.ecs.read_storage::(); + + for (entity, _monster, pos) in (&entities, &monsters, &positions).join() { + map.set_tile_at(Point { x: pos.x, y: pos.y }, TileType::Monster(entity)); + } + } let player_start_pos = Point { x: 40, y: 22 }; @@ -235,6 +247,10 @@ fn main() -> BError { }) .build(); + map.set_tile_at(player_start_pos, TileType::Player); + + gs.ecs.insert(map); + gs.ecs .insert(Point::new(player_start_pos.x, player_start_pos.y)); diff --git a/src/map.rs b/src/map.rs index 75b2fe2..25aa327 100644 --- a/src/map.rs +++ b/src/map.rs @@ -3,9 +3,12 @@ use crate::{ vga_color as vga, }; use bracket_lib::{prelude::*, random::RandomNumberGenerator}; +use specs::Entity; #[derive(PartialEq, Copy, Clone)] pub enum TileType { + Player, + Monster(Entity), Wall, BreakableWall, Floor, @@ -72,6 +75,15 @@ impl Map { let (x, y) = (point.x as usize, point.y as usize); match tile { + TileType::Player | TileType::Monster(_) => { + ctx.set( + x + MAP_X, + y + MAP_Y, + RGB::named(vga::BLACK), + RGB::named(vga::BLACK), + to_cp437(' '), + ); + } TileType::Floor => { ctx.set( x + MAP_X, diff --git a/src/systems/monster_motion.rs b/src/systems/monster_motion.rs index 6164b02..b7a4d31 100644 --- a/src/systems/monster_motion.rs +++ b/src/systems/monster_motion.rs @@ -32,14 +32,16 @@ impl<'a> System<'a> for MonsterMotion { player_pos, mut map, mut stats, - mut monster, - mut position, - mut renderable, + mut monsters, + mut positions, + mut renderables, ): Self::SystemData, ) { - for (entity, monster, position, renderable) in - (&entities, &mut monster, &mut position, &mut renderable).join() - { + let mut data = (&entities, &mut monsters, &mut positions, &mut renderables) + .join() + .collect::>(); + + for (entity, monster, position, renderable) in &mut data { if clock.has_ticked { monster.ticks_until_move -= 1; if monster.ticks_until_move <= 0 { @@ -70,20 +72,38 @@ impl<'a> System<'a> for MonsterMotion { y: position.y + delta_y, }; - if destination == *player_pos { - // TODO: Sound - stats.gems -= 1; - let _ = entities.delete(entity); - } + //for (entity, monster, position, renderable) in &data {} match map.get_tile_at(destination) { + TileType::Player => { + // TODO: Sound + stats.gems -= 1; + map.set_tile_at( + Point { + x: position.x, + y: position.y, + }, + TileType::Floor, + ); + let _ = entities.delete(*entity); + continue; + } + TileType::Monster(_) => {} TileType::Wall => {} TileType::BreakableWall => { // TODO: Sound map.set_tile_at(destination, TileType::Floor); - let _ = entities.delete(entity); + let _ = entities.delete(*entity); } TileType::Floor => { + map.set_tile_at( + Point { + x: position.x, + y: position.y, + }, + TileType::Floor, + ); + map.set_tile_at(destination, TileType::Monster(*entity)); position.x = destination.x; position.y = destination.y; }