mirror of
https://github.com/pcvolkmer/winelounge.git
synced 2025-04-19 18:36:50 +00:00
Move collision handling into world module
This commit is contained in:
parent
df383f95e3
commit
94efb64055
43
src/main.rs
43
src/main.rs
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
61
src/world.rs
61
src/world.rs
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user