summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.rs121
1 files changed, 115 insertions, 6 deletions
diff --git a/src/main.rs b/src/main.rs
index 59a4f8c..13c5c6c 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -44,6 +44,111 @@ impl Distribution<Occupant> for Standard {
}
#[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,
+ };
+ }
+}
+
+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: TILE_SCALE * 2.0,
+ y: 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 + TILE_WIDTH * TILE_SCALE * 2.0
+ && position.y < self.destination.y + TILE_WIDTH * TILE_SCALE * 2.0
+ }
+}
+
+#[derive(Clone, Copy)]
struct Cell {
occupant: Occupant,
position: Point2<f32>,
@@ -62,15 +167,10 @@ impl Cell {
}
pub fn contains(&self, position: Point2<f32>) -> bool {
- if position.x > self.position.x
+ position.x > self.position.x
&& position.y > self.position.y
&& position.x < self.position.x + TILE_WIDTH * TILE_SCALE
&& position.y < self.position.y + TILE_WIDTH * TILE_SCALE
- {
- return true;
- }
-
- false
}
pub fn moveable(&self) -> bool {
@@ -162,6 +262,7 @@ struct Game {
spritebatch: SpriteBatch,
grid: Vec<Vec<Cell>>,
background: Image,
+ cosmonaut: Cosmonaut,
}
impl Game {
@@ -191,6 +292,7 @@ impl Game {
Ok(Game {
grid,
selected: None,
+ cosmonaut: Cosmonaut::new(context)?,
spritebatch: SpriteBatch::new(image),
background,
})
@@ -312,6 +414,12 @@ impl EventHandler for Game {
let position = mouse::position(context);
+ if self.cosmonaut.contains(position) {
+ self.cosmonaut.start();
+ }
+
+ self.cosmonaut.update();
+
for row in self.grid.iter_mut() {
for cell in row.iter_mut() {
if cell.contains(position) {
@@ -391,6 +499,7 @@ impl EventHandler for Game {
fn draw(&mut self, context: &mut Context) -> GameResult {
graphics::clear(context, [0.0, 0.0, 0.0, 1.0].into());
graphics::draw(context, &self.background, DrawParam::default())?;
+ self.cosmonaut.draw(context)?;
for row in self.grid.iter() {
for cell in row.iter() {