diff --git a/src/main.rs b/src/main.rs index 2a1209c..943937b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ mod player; +mod sprite; mod world; use std::time::Duration; @@ -107,8 +108,7 @@ fn main() { } 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() - { + } else if content == BoxAreaContent::FilledBottle && !world.player.can_fill_glass() { ba.update_content(BoxAreaContent::FilledBottle); } } diff --git a/src/player.rs b/src/player.rs index 546ba2f..b79d5f3 100644 --- a/src/player.rs +++ b/src/player.rs @@ -1,5 +1,7 @@ -use crate::GLASS_SPACE; +use crate::sprite::Sprite; +use crate::{sprite, GLASS_SPACE}; use sdl2::rect::{Point, Rect}; +use sdl2::render::{Texture, WindowCanvas}; pub struct Player { pub position: Point, @@ -65,19 +67,26 @@ impl Player { Rect::new(self.position.x(), self.position.y(), 40, 115) } - pub fn sprite(&self) -> Rect { - let x = match self.footstep { - 1 => 60, - 2 => 115, - _ => 5, + pub fn render(&self, canvas: &mut WindowCanvas, texture: &Texture) { + let direction = match self.direction { + PlayerDirection::Down => sprite::PlayerDirection::Down, + PlayerDirection::Left => sprite::PlayerDirection::Left, + PlayerDirection::Right => sprite::PlayerDirection::Right, + PlayerDirection::Up => sprite::PlayerDirection::Up, }; - match self.direction { - PlayerDirection::Down => Rect::new(x, 5, 40, 115), - PlayerDirection::Left => Rect::new(x, 255, 40, 115), - PlayerDirection::Right => Rect::new(x, 130, 40, 115), - PlayerDirection::Up => Rect::new(x, 380, 40, 115), - } + let footstep = match self.footstep { + 1 => sprite::PlayerFootstep::Left, + 2 => sprite::PlayerFootstep::Right, + _ => sprite::PlayerFootstep::None, + }; + + Sprite::Player(direction, footstep).render( + canvas, + texture, + self.position.x(), + self.position.y(), + ); } pub fn face_up(&mut self) { diff --git a/src/sprite.rs b/src/sprite.rs new file mode 100644 index 0000000..b6d4da6 --- /dev/null +++ b/src/sprite.rs @@ -0,0 +1,73 @@ +use sdl2::rect::Rect; +use sdl2::render::{Texture, WindowCanvas}; + +pub enum Sprite { + BottleEmpty, + BottleFilled, + BushHorizontal, + BushVertical, + Flower, + GlassEmpty, + GlassFilled, + HiddenBox, + Lounge, + Nothing, + Player(PlayerDirection, PlayerFootstep), + Stone, +} + +pub enum PlayerFootstep { + None = 5, + Left = 60, + Right = 115, +} + +pub enum PlayerDirection { + Down, + Left, + Right, + Up, +} + +impl Sprite { + pub fn rect(&self) -> Rect { + match &self { + Sprite::BottleEmpty => Rect::new(35, 550, 20, 50), + Sprite::BottleFilled => Rect::new(5, 550, 20, 50), + Sprite::BushHorizontal => Rect::new(70, 510, 50, 25), + Sprite::BushVertical => Rect::new(70, 550, 25, 50), + Sprite::Flower => Rect::new(130, 550, 25, 25), + Sprite::GlassEmpty => Rect::new(35, 510, 20, 25), + Sprite::GlassFilled => Rect::new(5, 510, 20, 25), + Sprite::HiddenBox => Rect::new(5, 620, 50, 50), + Sprite::Lounge => Rect::new(5, 700, 150, 95), + Sprite::Nothing => Rect::new(70, 620, 50, 50), + Sprite::Stone => Rect::new(130, 510, 25, 25), + Sprite::Player(pd, fs) => Sprite::player_rect(pd, fs), + } + } + + pub fn size(&self) -> (u32, u32) { + self.rect().size() + } + + pub fn render(&self, canvas: &mut WindowCanvas, texture: &Texture, x: i32, y: i32) { + let render_rect = Rect::new(x, y, self.rect().width(), self.rect().height()); + let _r = canvas.copy(texture, self.rect(), render_rect); + } + + fn player_rect(player_direction: &PlayerDirection, footstep: &PlayerFootstep) -> Rect { + let x = match footstep { + PlayerFootstep::Left => 60, + PlayerFootstep::Right => 115, + _ => 5, + }; + + match player_direction { + PlayerDirection::Down => Rect::new(x, 5, 40, 115), + PlayerDirection::Left => Rect::new(x, 255, 40, 115), + PlayerDirection::Right => Rect::new(x, 130, 40, 115), + PlayerDirection::Up => Rect::new(x, 380, 40, 115), + } + } +} diff --git a/src/world.rs b/src/world.rs index 09ed7f3..4ce9190 100644 --- a/src/world.rs +++ b/src/world.rs @@ -1,3 +1,4 @@ +use crate::sprite::Sprite; use crate::{Player, GLASS_SPACE}; use sdl2::pixels::Color; use sdl2::rect::{Point, Rect}; @@ -146,27 +147,15 @@ impl World { canvas.fill_rect(Rect::new(5, 37, GLASS_SPACE as u32 * 25 + 5, 4)); if self.player.filled_glasses + self.player.empty_glasses >= i { - canvas.copy( - texture, - Rect::new(35, 510, 20, 25), - Rect::new((i as i32) * 25 - 15, 10, 20, 25), - ); + Sprite::GlassEmpty.render(canvas, texture, (i as i32) * 25 - 15, 10); } if self.player.filled_glasses >= i { - canvas.copy( - texture, - Rect::new(5, 510, 20, 25), - Rect::new((i as i32) * 25 - 15, 10, 20, 25), - ); + Sprite::GlassFilled.render(canvas, texture, (i as i32) * 25 - 15, 10); } }); // Lounge - canvas.copy( - texture, - Rect::new(5, 700, 150, 95), - Rect::new(325, 260, 150, 95), - ); + Sprite::Lounge.render(canvas, texture, 325, 260); // Box Areas self.right_top_box_area.render(canvas, texture); @@ -175,52 +164,20 @@ impl World { self.left_top_box_area.render(canvas, texture); // Decoration - canvas.copy( - texture, - Rect::new(130, 550, 25, 25), - Rect::new(235, 130, 25, 25), - ); - canvas.copy( - texture, - Rect::new(130, 550, 25, 25), - Rect::new(120, 210, 25, 25), - ); - canvas.copy( - texture, - Rect::new(130, 550, 25, 25), - Rect::new(535, 150, 25, 25), - ); - canvas.copy( - texture, - Rect::new(130, 550, 25, 25), - Rect::new(435, 370, 25, 25), - ); - canvas.copy( - texture, - Rect::new(130, 550, 25, 25), - Rect::new(235, 470, 25, 25), - ); - canvas.copy( - texture, - Rect::new(130, 550, 25, 25), - Rect::new(555, 510, 25, 25), - ); + Sprite::Flower.render(canvas, texture, 235, 130); + Sprite::Flower.render(canvas, texture, 120, 210); + Sprite::Flower.render(canvas, texture, 535, 150); + Sprite::Flower.render(canvas, texture, 435, 370); + Sprite::Flower.render(canvas, texture, 235, 470); + Sprite::Flower.render(canvas, texture, 555, 510); // Stops for s in &self.stops { - canvas.copy( - texture, - Rect::new(130, 510, 25, 25), - Rect::new(s.x(), s.y(), 25, 25), - ); + Sprite::Stone.render(canvas, texture, s.x(), s.y()) } // Player - canvas.copy( - texture, - self.player.sprite(), - Rect::new(self.player.position.x(), self.player.position.y(), 40, 115), - ); + self.player.render(canvas, texture); // Points let x = font @@ -311,48 +268,30 @@ impl BoxArea { let y_offset = self.bounding_rect().y(); // Border - canvas.copy( - texture, - Rect::new(70, 510, 50, 25), - Rect::new(x_offset + 30, y_offset, 50, 25), - ); - canvas.copy( - texture, - Rect::new(70, 510, 50, 25), - Rect::new(x_offset + 30, y_offset + 85, 50, 25), - ); - let dst = match self.position { - BoxAreaPosition::RightTop => Rect::new(x_offset + 85, y_offset + 30, 25, 50), - BoxAreaPosition::RightBottom => Rect::new(x_offset + 85, y_offset + 30, 25, 50), - BoxAreaPosition::LeftBottom => Rect::new(x_offset, y_offset + 30, 25, 50), - BoxAreaPosition::LeftTop => Rect::new(x_offset, y_offset + 30, 25, 50), + Sprite::BushHorizontal.render(canvas, texture, x_offset + 30, y_offset); + Sprite::BushHorizontal.render(canvas, texture, x_offset + 30, y_offset + 85); + let (dst_x, dst_y) = match self.position { + BoxAreaPosition::RightTop => (x_offset + 85, y_offset + 30), + BoxAreaPosition::RightBottom => (x_offset + 85, y_offset + 30), + BoxAreaPosition::LeftBottom => (x_offset, y_offset + 30), + BoxAreaPosition::LeftTop => (x_offset, y_offset + 30), }; - canvas.copy(texture, Rect::new(70, 550, 25, 50), dst); + Sprite::BushVertical.render(canvas, texture, dst_x, dst_y); // Box - let box_src = match self.content { - BoxAreaContent::Nothing => Rect::new(70, 620, 50, 50), - BoxAreaContent::HiddenBox => Rect::new(5, 620, 50, 50), - BoxAreaContent::EmptyGlass => Rect::new(35, 510, 20, 25), - BoxAreaContent::FilledBottle => Rect::new(5, 550, 20, 50), - BoxAreaContent::EmptyBottle => Rect::new(35, 550, 20, 50), + let box_sprite = match &self.content { + BoxAreaContent::HiddenBox => Sprite::HiddenBox, + BoxAreaContent::FilledBottle => Sprite::BottleFilled, + BoxAreaContent::EmptyBottle => Sprite::BottleEmpty, + BoxAreaContent::EmptyGlass => Sprite::GlassEmpty, + BoxAreaContent::Nothing => Sprite::Nothing, }; - let (box_width, box_height) = match self.content { - BoxAreaContent::Nothing => (50, 50), - BoxAreaContent::HiddenBox => (50, 50), - BoxAreaContent::EmptyGlass => (20, 25), - BoxAreaContent::FilledBottle => (20, 50), - BoxAreaContent::EmptyBottle => (20, 50), - }; - canvas.copy( + let (box_width, box_height) = box_sprite.size(); + box_sprite.render( + canvas, texture, - box_src, - Rect::new( - x_offset + 30 + (50 - box_width) / 2, - y_offset + 30 + (50 - box_height) / 2, - box_width as u32, - box_height as u32, - ), + x_offset + 30 + (50 - box_width as i32) / 2, + y_offset + 30 + (50 - box_height as i32) / 2, ); } }