Мышь имеет координаты на экране, а потому мы можем использовать их в качестве пункта назначения для игрока. Мы можем использовать метод arrival объекта mBoid. Он задает цель, которую будет преследовать игрок. Движение будет плавным, а по мере приближения скорость хоккеиста будет падать и, в конце концов, станет равна 0.
Давайте заменим блуждающий метод в классе Athlete на движение к курсору мыши:
public class Athlete { // (…).
public function update ():void {.
// очистка всех действующих сил.
mBoid.steering = null;
// игрок управляет хоккеистом,.
// поэтому он будет следовать за курсором мыши.
followMouseCursor ();
// главный метод обновления физического тела.
mBoid.update (); }.
private function followMouseCursor () :void {.
var aMouse: Vector3D = getMouseCursorPosition ();
mBoid.steering = mBoid. steering + mBoid. arrive (aMouse, 50); } }.
В результате мы получим возможность управлять нашим игроком мышью, а движение получится плавным и реалистичным:
Добавим шайбу
Шайба будет описываться классом Puck. Самое важное здесь — метод update () и поле mOwner.
public class Puck {.
public var velocity: Vector3D;
public var position: Vector3D;
private var mOwner: Athlete; // хоккеист, который владеет шайбой.
public function setOwner (theOwner :Athlete) :void {.
if (mOwner ≠ theOwner) {.
mOwner = theOwner;
velocity = null; } }.
public function update ():void { }.
public function get owner () :Athlete { return mOwner; } }.
Следуя той же логике, что и выше, метод update () будет выполняться каждый раз, пока запущена игра. Поле mOwner будет хранить того хоккеиста, который владеет шайбой. Если же mOwner равно null, то шайба никому не принадлежит и она свободно скользит по катку.
Если же mOwner не равно null, то владелец у шайбы имеется. В этом случае шайба насильно ставится перед своим владельцем. Для этого используется вектор скорости хоккеиста, который также соответствует и вектору направления. Вот наглядная иллюстрация:
public class Puck {.
// (…).
private function placeAheadOfOwner () :void {.
var ahead: Vector3D = mOwner.boid.velocity.clone ();
ahead = normalize (ahead) * 30;
position = mOwner.boid.position + ahead; }.
override public function update ():void {.
if (mOwner ≠ null) {.
placeAheadOfOwner (); } }.
// (…) }.
В классе PlayState есть проверка на коллизию с шайбой. Если какой-то хоккеист перекроет шайбу, то он становится новым владельцем. Вы можете протестировать это в демо-режиме, представленном ниже: