diff options
author | Tom Barrett <tom@tombarrett.xyz> | 2021-03-14 21:03:53 +0100 |
---|---|---|
committer | Tom Barrett <tom@tombarrett.xyz> | 2021-03-14 21:03:53 +0100 |
commit | a0c406ca212ed4f2a3bc41bbdacc789ee57da42e (patch) | |
tree | 52c8ba4152b459c96b867ced8b37103b9b06a9fe /src/cosmonaut.rs | |
parent | e3238817205b2c5d2504330135ffc552881b1a73 (diff) |
split up into multiple files
Diffstat (limited to 'src/cosmonaut.rs')
-rw-r--r-- | src/cosmonaut.rs | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/src/cosmonaut.rs b/src/cosmonaut.rs new file mode 100644 index 0000000..235861e --- /dev/null +++ b/src/cosmonaut.rs @@ -0,0 +1,110 @@ +use crate::constants; +use ggez::graphics::{self, DrawParam, FilterMode, Image, Rect}; +use ggez::mint::{Point2, Vector2}; +use ggez::{Context, GameResult}; +use std::time::Instant; + +#[derive(Clone, Copy)] +enum CosmonautFrames { + None, + One, + Two, + Three, + Four, +} + +impl CosmonautFrames { + pub fn next(&mut self) { + *self = match self { + CosmonautFrames::None => CosmonautFrames::One, + CosmonautFrames::One => CosmonautFrames::Two, + CosmonautFrames::Two => CosmonautFrames::Three, + CosmonautFrames::Three => CosmonautFrames::Four, + CosmonautFrames::Four => CosmonautFrames::None, + }; + } +} + +pub struct Cosmonaut { + destination: Point2<f32>, + image: Image, + frame: CosmonautFrames, + timer: Instant, + scale: Vector2<f32>, +} + +impl Cosmonaut { + pub fn new(context: &mut Context) -> GameResult<Cosmonaut> { + let mut image = Image::new(context, "/cosmonaut.png")?; + image.set_filter(FilterMode::Nearest); + + Ok(Cosmonaut { + image, + destination: Point2 { x: 600.0, y: 200.0 }, + frame: CosmonautFrames::None, + timer: Instant::now(), + scale: Vector2 { + x: constants::TILE_SCALE * 2.0, + y: constants::TILE_SCALE * 2.0, + }, + }) + } + + pub fn draw(&self, context: &mut Context) -> GameResult { + graphics::draw( + context, + &self.image, + DrawParam::default() + .dest(self.destination) + .scale(self.scale) + .src(Rect::new(0.0, 0.0, 1.0 / 3.0, 1.0)), + )?; + let source = match self.frame { + CosmonautFrames::None => None, + CosmonautFrames::One => Some(Rect::new(1.0 / 3.0, 0.0, 1.0 / 3.0, 1.0 / 2.0)), + CosmonautFrames::Two => Some(Rect::new(2.0 / 3.0, 0.0, 1.0, 1.0 / 2.0)), + CosmonautFrames::Three => Some(Rect::new(1.0 / 3.0, 1.0 / 2.0, 1.0 / 3.0, 1.0 / 2.0)), + CosmonautFrames::Four => Some(Rect::new(2.0 / 3.0, 1.0 / 2.0, 1.0, 1.0)), + }; + if let Some(source) = source { + graphics::draw( + context, + &self.image, + DrawParam::default() + .dest(self.destination) + .src(source) + .scale(self.scale), + )?; + } + + Ok(()) + } + + pub fn update(&mut self) { + match self.frame { + CosmonautFrames::None => (), + _ => { + if self.timer.elapsed().as_millis() > 50 { + self.frame.next(); + self.timer = Instant::now(); + } + } + } + } + + pub fn start(&mut self) { + if let CosmonautFrames::None = self.frame { + if self.timer.elapsed().as_secs() > 5 { + self.timer = Instant::now(); + self.frame.next() + } + } + } + + pub fn contains(&self, position: Point2<f32>) -> bool { + position.x > self.destination.x + && position.y > self.destination.y + && position.x < self.destination.x + constants::TILE_WIDTH * constants::TILE_SCALE * 2.0 + && position.y < self.destination.y + constants::TILE_WIDTH * constants::TILE_SCALE * 2.0 + } +} |