]> git.seodisparate.com - LudumDare45_StartWithNothing/commitdiff
Add player
authorStephen Seo <seo.disparate@gmail.com>
Sat, 5 Oct 2019 06:38:12 +0000 (15:38 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Sat, 5 Oct 2019 06:38:12 +0000 (15:38 +0900)
src/main.rs

index b478e61d6f9b8170c9d0a3f1abf945fa53367684..d9e1d9d25c81ba32ac3daf5687b53dc43c56f256 100644 (file)
@@ -1,5 +1,5 @@
 use quicksilver::{
-    geom::{Circle, Rectangle, Vector},
+    geom::{Circle, Rectangle, Transform, Vector},
     graphics::{
         Background::{Col, Img},
         Color, Font, FontStyle, Image,
@@ -15,6 +15,7 @@ const WIDTH_F: f32 = 800.0;
 const HEIGHT_F: f32 = 600.0;
 const MUSIC2_LENGTH: f64 = 2.0 * 60.0 * 1000.0;
 const TEXT_RATE: f64 = 100.0;
+const PP_GEN_RATE: f64 = 75.0;
 
 enum MenuItemType {
     Button {
@@ -375,6 +376,16 @@ impl Menu {
     }
 }
 
+struct Particle {
+    rect: Rectangle,
+    velx: f32,
+    vely: f32,
+    velr: f32,
+    r: f32,
+    lifetime: f64,
+    life_timer: f64,
+}
+
 struct GameState {
     s_boom: Asset<Sound>,
     s_get: Asset<Sound>,
@@ -392,6 +403,11 @@ struct GameState {
     selection_mode: bool,
     current_item: Option<usize>,
     current_finished: bool,
+    player: Rectangle,
+    player_r: f64,
+    player_particles: Vec<Particle>,
+    player_opacity: f32,
+    pp_timer: f64,
 }
 
 impl State for GameState {
@@ -413,6 +429,11 @@ impl State for GameState {
             selection_mode: true,
             current_item: None,
             current_finished: true,
+            player: Rectangle::new((400.0, 300.0), (32.0, 32.0)),
+            player_r: 0.0,
+            player_particles: Vec::new(),
+            player_opacity: 0.0,
+            pp_timer: 0.0,
         })
     }
 
@@ -525,6 +546,8 @@ impl State for GameState {
     fn update(&mut self, window: &mut Window) -> Result<()> {
         let dt = window.update_rate();
 
+        self.player_r += dt / 10.0;
+
         if self.state_dirty {
             self.state_dirty = false;
             if self.state > 1 && !self.music_on {
@@ -575,10 +598,18 @@ impl State for GameState {
                     self.current_item = None;
                     self.selection_mode = true;
                     self.state = 0;
+                    self.player_opacity = 0.0;
                 }
             }
         }
 
+        if self.player_opacity < 1.0 && self.state > 1 {
+            self.player_opacity += dt as f32 / 7000.0;
+            if self.player_opacity > 1.0 {
+                self.player_opacity = 1.0;
+            }
+        }
+
         if self.music_on {
             self.music_timer += dt;
             if self.music_timer > MUSIC2_LENGTH {
@@ -657,6 +688,32 @@ impl State for GameState {
                 }
             }
         }
+
+        for i in (0..self.player_particles.len()).rev() {
+            self.player_particles[i].life_timer += dt;
+            if self.player_particles[i].life_timer >= self.player_particles[i].lifetime {
+                self.player_particles.swap_remove(i);
+            } else {
+                self.player_particles[i].rect.pos.x += self.player_particles[i].velx * dt as f32;
+                self.player_particles[i].rect.pos.y += self.player_particles[i].vely * dt as f32;
+                self.player_particles[i].r += self.player_particles[i].velr * dt as f32;
+            }
+        }
+
+        self.pp_timer += dt;
+        if self.pp_timer > PP_GEN_RATE {
+            self.pp_timer -= PP_GEN_RATE;
+            self.player_particles.push(Particle {
+                rect: self.player.clone(),
+                velx: rand::thread_rng().gen_range(-0.2, 0.2),
+                vely: rand::thread_rng().gen_range(-0.2, 0.2),
+                velr: rand::thread_rng().gen_range(-0.5, 0.5),
+                r: rand::thread_rng().gen_range(0.0, 90.0),
+                lifetime: 1000.0,
+                life_timer: 0.0,
+            });
+        }
+
         Ok(())
     }
 
@@ -706,6 +763,27 @@ impl State for GameState {
                 MenuItemType::Pause { timer, length } => (),
             }
         }
+        for particle in &self.player_particles {
+            window.draw_ex(
+                &particle.rect,
+                Col(Color::from_rgba(
+                    0xFF,
+                    0xFF,
+                    0xFF,
+                    (1.0 - (particle.life_timer / particle.lifetime) as f32) * self.player_opacity,
+                )),
+                Transform::translate((-particle.rect.size.x / 2.0, -particle.rect.size.y / 2.0))
+                    * Transform::rotate(particle.r),
+                1,
+            );
+        }
+        window.draw_ex(
+            &self.player,
+            Col(Color::from_rgba(0xFF, 0xFF, 0xFF, self.player_opacity)),
+            Transform::translate((-self.player.size.x / 2.0, -self.player.size.y / 2.0))
+                * Transform::rotate(self.player_r as f32),
+            1,
+        );
         Ok(())
     }
 }