Mercurial > touhou
changeset 693:14fddc27e6f5
ecl_vm: implement TargetPlayer, and add a dummy Player to Game.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Sat, 17 Aug 2019 15:33:45 +0200 |
parents | a35df65e0d57 |
children | 3ff1af76e413 |
files | src/th06/ecl_vm.rs src/th06/enemy.rs |
diffstat | 2 files changed, 34 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/th06/ecl_vm.rs +++ b/src/th06/ecl_vm.rs @@ -532,16 +532,16 @@ impl EclRunner { enemy.angle = angle; } // 51 - /* - SubInstruction::TargetPlayer(angle, speed) => { + SubInstruction::TargetPlayer(delta_angle, speed) => { + let speed = self.get_f32(speed); let mut enemy = self.enemy.borrow_mut(); - let player = enemy.select_player(); + let game = enemy.game.upgrade().unwrap(); + let player = game.borrow().get_player(); enemy.update_mode = 0; enemy.speed = speed; - enemy.angle = enemy.get_angle(player) + angle; + enemy.angle = enemy.get_angle_to(player) + delta_angle; + } - } - */ // 52 to 64 are different interlacing fields // 65
--- a/src/th06/enemy.rs +++ b/src/th06/enemy.rs @@ -47,6 +47,16 @@ impl std::ops::Add<Offset> for Position } } +impl std::ops::Sub<Position> for Position { + type Output = Offset; + fn sub(self, other: Position) -> Offset { + Offset { + dx: other.x - self.x, + dy: other.y - self.y, + } + } +} + #[derive(Debug, Clone)] struct Callback; @@ -60,10 +70,16 @@ pub struct Laser { #[derive(Debug, Clone, Default)] struct Process; +/// Struct representing the player. +pub struct Player { + pos: Position, +} + /// God struct of our game. pub struct Game { enemies: Vec<Rc<RefCell<Enemy>>>, anmrunners: Vec<Rc<RefCell<AnmRunner>>>, + player: Rc<RefCell<Player>>, prng: Rc<RefCell<Prng>>, rank: Rank, difficulty: i32, @@ -75,6 +91,7 @@ impl Game { Game { enemies: Vec::new(), anmrunners: Vec::new(), + player: Rc::new(RefCell::new(Player { pos: Position { x: 192., y: 384. } })), prng, rank, difficulty: 0, @@ -107,6 +124,10 @@ impl Game { } sprites } + + pub(crate) fn get_player(&self) -> Rc<RefCell<Player>> { + self.player.clone() + } } /// Common to all elements in game. @@ -440,6 +461,13 @@ impl Enemy { let game = game.borrow(); game.difficulty } + + // TODO: use a trait for positionable entities. + pub(crate) fn get_angle_to(&self, player: Rc<RefCell<Player>>) -> f32 { + let player = player.borrow(); + let offset = self.pos - player.pos; + offset.dy.atan2(offset.dx) + } } trait Renderable {