mirror of
https://github.com/pcvolkmer/winelounge.git
synced 2025-04-19 18:36:50 +00:00
Changed collision detection
This commit is contained in:
parent
0d7a4fb391
commit
f0e54e718d
43
src/main.rs
43
src/main.rs
@ -5,7 +5,7 @@ mod world;
|
||||
use std::time::Duration;
|
||||
|
||||
use crate::player::Player;
|
||||
use crate::world::{BoxAreaContent, BoxAreaPosition, World};
|
||||
use crate::world::{BoxAreaContent, BoxAreaPosition, Collision, World};
|
||||
use sdl2::event::Event;
|
||||
use sdl2::image::LoadTexture;
|
||||
use sdl2::keyboard::Keycode;
|
||||
@ -80,19 +80,34 @@ fn main() {
|
||||
}
|
||||
}
|
||||
|
||||
if world.collides_with_lounge() && world.player.can_drink_glass() {
|
||||
world.player.drink_glass()
|
||||
handle_lounge_collisions(&mut world);
|
||||
handle_boxarea_collisions(&mut world);
|
||||
|
||||
if chrono::Utc::now().timestamp_millis() % 1000 > 950 {
|
||||
world.update_box_areas();
|
||||
}
|
||||
|
||||
let colliding_box_area = match world.collides_with_box_area() {
|
||||
Some(BoxAreaPosition::RightTop) => Option::Some(&mut world.right_top_box_area),
|
||||
Some(BoxAreaPosition::RightBottom) => Option::Some(&mut world.right_bottom_box_area),
|
||||
Some(BoxAreaPosition::LeftBottom) => Option::Some(&mut world.left_bottom_box_area),
|
||||
Some(BoxAreaPosition::LeftTop) => Option::Some(&mut world.left_top_box_area),
|
||||
None => Option::None,
|
||||
world.render(&mut canvas, &texture, &font);
|
||||
|
||||
::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,
|
||||
};
|
||||
|
||||
if let Some(ba) = colliding_box_area {
|
||||
let content = match &ba.content {
|
||||
BoxAreaContent::HiddenBox => BoxAreaContent::random(),
|
||||
BoxAreaContent::EmptyGlass => BoxAreaContent::EmptyGlass,
|
||||
@ -112,12 +127,4 @@ fn main() {
|
||||
ba.update_content(BoxAreaContent::FilledBottle);
|
||||
}
|
||||
}
|
||||
|
||||
if chrono::Utc::now().timestamp_millis() % 1000 > 950 {
|
||||
world.update_box_areas();
|
||||
}
|
||||
world.render(&mut canvas, &texture, &font);
|
||||
|
||||
::std::thread::sleep(Duration::from_millis(25));
|
||||
}
|
||||
}
|
||||
|
74
src/world.rs
74
src/world.rs
@ -42,34 +42,16 @@ impl World {
|
||||
Rect::new(0, 50, 800, 550)
|
||||
}
|
||||
|
||||
pub fn collides_with_box_area(&mut self) -> Option<BoxAreaPosition> {
|
||||
if self.right_top_box_area.collides_with(&self.player) {
|
||||
return Some(BoxAreaPosition::RightTop);
|
||||
} else if self.right_bottom_box_area.collides_with(&self.player) {
|
||||
return Some(BoxAreaPosition::RightBottom);
|
||||
} else if self.left_bottom_box_area.collides_with(&self.player) {
|
||||
return Some(BoxAreaPosition::LeftBottom);
|
||||
} else if self.left_top_box_area.collides_with(&self.player) {
|
||||
return Some(BoxAreaPosition::LeftTop);
|
||||
pub fn has_player_collision(&mut self) -> Collision {
|
||||
if let Some(ba) = self.collides_with_box_area() {
|
||||
return Collision::BoxArea(ba);
|
||||
} else if self.collides_with_lounge() {
|
||||
return Collision::Lounge;
|
||||
} else if self.collides_with_stop() {
|
||||
return Collision::Stopper;
|
||||
}
|
||||
|
||||
None
|
||||
}
|
||||
|
||||
pub fn collides_with_lounge(&mut self) -> bool {
|
||||
let lounge_rect = Rect::new(325, 260, 150, 95);
|
||||
lounge_rect.contains_point(self.player.center())
|
||||
}
|
||||
|
||||
fn collides_with_stop(&mut self) -> bool {
|
||||
for s in &self.stops {
|
||||
let x = s.x() + 12;
|
||||
let y = s.y() + 12;
|
||||
if self.player.bounding_rect().contains_point(Point::new(x, y)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
false
|
||||
Collision::None
|
||||
}
|
||||
|
||||
pub fn move_up(&mut self) {
|
||||
@ -192,6 +174,44 @@ impl World {
|
||||
|
||||
canvas.present();
|
||||
}
|
||||
|
||||
fn collides_with_box_area(&mut self) -> Option<BoxAreaPosition> {
|
||||
if self.right_top_box_area.collides_with(&self.player) {
|
||||
return Some(BoxAreaPosition::RightTop);
|
||||
} else if self.right_bottom_box_area.collides_with(&self.player) {
|
||||
return Some(BoxAreaPosition::RightBottom);
|
||||
} else if self.left_bottom_box_area.collides_with(&self.player) {
|
||||
return Some(BoxAreaPosition::LeftBottom);
|
||||
} else if self.left_top_box_area.collides_with(&self.player) {
|
||||
return Some(BoxAreaPosition::LeftTop);
|
||||
}
|
||||
|
||||
None
|
||||
}
|
||||
|
||||
fn collides_with_lounge(&mut self) -> bool {
|
||||
let lounge_rect = Rect::new(325, 260, 150, 95);
|
||||
lounge_rect.contains_point(self.player.center())
|
||||
}
|
||||
|
||||
fn collides_with_stop(&mut self) -> bool {
|
||||
for s in &self.stops {
|
||||
let x = s.x() + 12;
|
||||
let y = s.y() + 12;
|
||||
if self.player.bounding_rect().contains_point(Point::new(x, y)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub enum Collision {
|
||||
BoxArea(BoxAreaPosition),
|
||||
Lounge,
|
||||
Stopper,
|
||||
None,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
@ -269,7 +289,7 @@ impl BoxArea {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub enum BoxAreaPosition {
|
||||
RightTop,
|
||||
RightBottom,
|
||||
|
Loading…
x
Reference in New Issue
Block a user