# HG changeset patch # User Emmanuel Gil Peyrot # Date 1565540041 -7200 # Node ID 107bb5ca5cc8719db68f8dab01a2737597e2005e # Parent 598f3125cbacc184b3ae056497202ae916259ebe Implement Enemy::update(), which now renders the first fairy from stage 1 perfectly! diff --git a/examples/eclrenderer.rs b/examples/eclrenderer.rs --- a/examples/eclrenderer.rs +++ b/examples/eclrenderer.rs @@ -96,7 +96,7 @@ fn main() { return; } let ecl_filename = &args[1]; - let sub = args[2].parse().expect("number"); + let sub: u8 = args[2].parse().expect("number"); let anm_filename = &args[3]; let png_filename = &args[4]; @@ -115,7 +115,7 @@ fn main() { let anm0 = Anm0::from_slice(&buf).unwrap(); let anm0 = Rc::new(RefCell::new(anm0)); - if ecl.subs.len() < sub { + if ecl.subs.len() < sub as usize { eprintln!("This ecl doesn’t contain a sub named {}.", sub); return; } @@ -129,7 +129,7 @@ fn main() { // And the enemy object. let enemy = Enemy::new(Position::new(0., 0.), 500, 0, 640, Rc::downgrade(&anm0), Rc::downgrade(&game)); - let mut ecl_runner = EclRunner::new(&ecl, enemy.clone(), 0); + let mut ecl_runner = EclRunner::new(&ecl, enemy.clone(), sub); assert_eq!(std::mem::size_of::(), std::mem::size_of::()); let vertices: [Vertex; 4] = unsafe { std::mem::uninitialized() }; @@ -151,7 +151,6 @@ fn main() { let mut back_buffer = Framebuffer::back_buffer(surface.size()); - let mut frame = 0; 'app: loop { for event in surface.poll_events() { match event { @@ -168,7 +167,6 @@ fn main() { if ecl_runner.running == false { break; } - frame += 1; { let mut slice = tess @@ -176,6 +174,10 @@ fn main() { .unwrap(); ecl_runner.run_frame(); + { + let mut enemy = enemy.borrow_mut(); + enemy.update(); + } let mut game = game.borrow_mut(); game.run_frame(); let sprites = game.get_sprites(); diff --git a/src/th06/enemy.rs b/src/th06/enemy.rs --- a/src/th06/enemy.rs +++ b/src/th06/enemy.rs @@ -234,6 +234,34 @@ impl Enemy { self.hitbox_half_size = [width, height]; } + /// Run all interpolators and such, and update internal variables once per + /// frame. + pub fn update(&mut self) { + let Position { mut x, mut y } = self.pos; + + let speed = if self.update_mode == 1 { + 0. + } else { + let speed = self.speed; + self.speed += self.acceleration; + self.angle += self.rotation_speed; + speed + }; + + let dx = self.angle.cos() * speed; + let dy = self.angle.sin() * speed; + if self.type_ & 2 != 0 { + x -= dx; + } else { + x += dx; + } + y += dy; + + self.pos = Position { x, y }; + + self.frame += 1; + } + pub(crate) fn get_rank(&self) -> i32 { let game = self.game.upgrade().unwrap(); let game = game.borrow();