Move collision handling into world module

This commit is contained in:
Paul-Christian Volkmer 2022-03-01 10:58:56 +01:00
parent df383f95e3
commit 94efb64055
2 changed files with 54 additions and 50 deletions

View File

@ -5,7 +5,7 @@ mod world;
use std::time::Duration; use std::time::Duration;
use crate::player::Player; use crate::player::Player;
use crate::world::{BoxAreaContent, BoxAreaPosition, Collision, World}; use crate::world::World;
use sdl2::event::Event; use sdl2::event::Event;
use sdl2::image::LoadTexture; use sdl2::image::LoadTexture;
use sdl2::keyboard::Keycode; use sdl2::keyboard::Keycode;
@ -80,51 +80,14 @@ fn main() {
} }
} }
handle_lounge_collisions(&mut world);
handle_boxarea_collisions(&mut world);
if chrono::Utc::now().timestamp_millis() % 1000 > 950 { if chrono::Utc::now().timestamp_millis() % 1000 > 950 {
world.update_box_areas(); world.update_box_areas();
} }
world.handle_collisions();
world.render(&mut canvas, &texture, &font); world.render(&mut canvas, &texture, &font);
::std::thread::sleep(Duration::from_millis(25)); ::std::thread::sleep(Duration::from_millis(25));
} }
} }
fn handle_lounge_collisions(world: &mut World) {
if Collision::Lounge == world.has_player_collision() && world.player.can_drink_glass() {
world.player.drink_glass()
}
}
fn handle_boxarea_collisions(world: &mut World) {
if let Collision::BoxArea(bap) = world.has_player_collision() {
let ba = match bap {
BoxAreaPosition::RightTop => &mut world.right_top_box_area,
BoxAreaPosition::RightBottom => &mut world.right_bottom_box_area,
BoxAreaPosition::LeftBottom => &mut world.left_bottom_box_area,
BoxAreaPosition::LeftTop => &mut world.left_top_box_area,
};
let content = match &ba.content {
BoxAreaContent::HiddenBox => BoxAreaContent::random(),
BoxAreaContent::EmptyGlass => BoxAreaContent::EmptyGlass,
BoxAreaContent::FilledBottle => BoxAreaContent::FilledBottle,
_ => BoxAreaContent::Nothing,
};
if content == BoxAreaContent::EmptyGlass && world.player.can_pick_glass() {
ba.update_content(BoxAreaContent::Nothing);
world.player.pick_glass();
} else if content == BoxAreaContent::EmptyGlass && !world.player.can_pick_glass() {
ba.update_content(BoxAreaContent::EmptyGlass);
} else if content == BoxAreaContent::FilledBottle && world.player.can_fill_glass() {
ba.update_content(BoxAreaContent::EmptyBottle);
world.player.fill_glass();
} else if content == BoxAreaContent::FilledBottle && !world.player.can_fill_glass() {
ba.update_content(BoxAreaContent::FilledBottle);
}
}
}

View File

@ -6,11 +6,11 @@ use sdl2::render::{Texture, WindowCanvas};
use sdl2::ttf::Font; use sdl2::ttf::Font;
pub struct World { pub struct World {
pub player: Player, player: Player,
pub right_top_box_area: BoxArea, right_top_box_area: BoxArea,
pub right_bottom_box_area: BoxArea, right_bottom_box_area: BoxArea,
pub left_bottom_box_area: BoxArea, left_bottom_box_area: BoxArea,
pub left_top_box_area: BoxArea, left_top_box_area: BoxArea,
stops: Vec<Point>, stops: Vec<Point>,
} }
@ -42,7 +42,7 @@ impl World {
Rect::new(0, 50, 800, 550) Rect::new(0, 50, 800, 550)
} }
pub fn has_player_collision(&mut self) -> Collision { fn has_player_collision(&mut self) -> Collision {
if let Some(ba) = self.collides_with_box_area() { if let Some(ba) = self.collides_with_box_area() {
return Collision::BoxArea(ba); return Collision::BoxArea(ba);
} else if self.collides_with_lounge() { } else if self.collides_with_lounge() {
@ -111,6 +111,11 @@ impl World {
} }
} }
pub fn handle_collisions(&mut self) {
self.handle_lounge_collisions();
self.handle_boxarea_collisions();
}
pub fn render(&self, canvas: &mut WindowCanvas, texture: &Texture, font: &Font) { pub fn render(&self, canvas: &mut WindowCanvas, texture: &Texture, font: &Font) {
canvas.clear(); canvas.clear();
@ -204,10 +209,46 @@ impl World {
} }
false false
} }
fn handle_lounge_collisions(&mut self) {
if Collision::Lounge == self.has_player_collision() && self.player.can_drink_glass() {
self.player.drink_glass()
}
}
fn handle_boxarea_collisions(&mut self) {
if let Collision::BoxArea(bap) = self.has_player_collision() {
let ba = match bap {
BoxAreaPosition::RightTop => &mut self.right_top_box_area,
BoxAreaPosition::RightBottom => &mut self.right_bottom_box_area,
BoxAreaPosition::LeftBottom => &mut self.left_bottom_box_area,
BoxAreaPosition::LeftTop => &mut self.left_top_box_area,
};
let content = match &ba.content {
BoxAreaContent::HiddenBox => BoxAreaContent::random(),
BoxAreaContent::EmptyGlass => BoxAreaContent::EmptyGlass,
BoxAreaContent::FilledBottle => BoxAreaContent::FilledBottle,
_ => BoxAreaContent::Nothing,
};
if content == BoxAreaContent::EmptyGlass && self.player.can_pick_glass() {
ba.update_content(BoxAreaContent::Nothing);
self.player.pick_glass();
} else if content == BoxAreaContent::EmptyGlass && !self.player.can_pick_glass() {
ba.update_content(BoxAreaContent::EmptyGlass);
} else if content == BoxAreaContent::FilledBottle && self.player.can_fill_glass() {
ba.update_content(BoxAreaContent::EmptyBottle);
self.player.fill_glass();
} else if content == BoxAreaContent::FilledBottle && !self.player.can_fill_glass() {
ba.update_content(BoxAreaContent::FilledBottle);
}
}
}
} }
#[derive(Debug, PartialEq, Eq)] #[derive(Debug, PartialEq, Eq)]
pub enum Collision { enum Collision {
BoxArea(BoxAreaPosition), BoxArea(BoxAreaPosition),
Lounge, Lounge,
Stopper, Stopper,
@ -215,7 +256,7 @@ pub enum Collision {
} }
#[derive(Debug)] #[derive(Debug)]
pub struct BoxArea { struct BoxArea {
position: BoxAreaPosition, position: BoxAreaPosition,
pub content: BoxAreaContent, pub content: BoxAreaContent,
last_update: i64, last_update: i64,
@ -230,7 +271,7 @@ impl BoxArea {
} }
} }
pub fn update_content(&mut self, content: BoxAreaContent) { fn update_content(&mut self, content: BoxAreaContent) {
self.content = content; self.content = content;
self.last_update = chrono::Utc::now().timestamp(); self.last_update = chrono::Utc::now().timestamp();
} }
@ -307,7 +348,7 @@ pub enum BoxAreaContent {
} }
impl BoxAreaContent { impl BoxAreaContent {
pub fn random() -> BoxAreaContent { fn random() -> BoxAreaContent {
match rand::random::<i32>() % 5 { match rand::random::<i32>() % 5 {
1 | 4 => BoxAreaContent::EmptyGlass, 1 | 4 => BoxAreaContent::EmptyGlass,
2 | 3 => BoxAreaContent::FilledBottle, 2 | 3 => BoxAreaContent::FilledBottle,