public class Athlete {.
public function Athlete (thePosX :Number, thePosY: Number, theTotalMass: Number, theTeam: FlxGroup) { // указание ИИ состояния 'idle'.
mBrain.pushState (idle); }.
private function idle () :void {.
var aPuck: Puck = getPuck ();
stopAndlookAt (aPuck.position); }.
private function stopAndlookAt (thePoint :Vector3D) :void {.
mBoid.velocity = thePoint — mBoid. position;
mBoid.velocity = normalize (mBoid.velocity) * 0.01; } }.
На данный момент это состояние будет активным всегда. Но в дальнейшем, оно заменит собой другие состояния, например, attack.
Метод stopAndlookAt () высчитывает нужное направление по тому же алгоритму, по которому мы вычисляли направление удара. Вектор, начинающийся с позиции хоккеиста и заканчивающийся позицией шайбы, измеряется по формуле thePoint — mBoid. position и используется для указания направления взгляда спортсмена.
Если применить полученный вектор к хоккеисту, то он устремиться к шайбе. Для того, чтобы он оставался на месте, мы умножаем вектор на число, близкое к нулю, т. е. на 0.01. Это удерживает спортсмена на месте, однако, смотреть он будет на шайбу.
Подготовка к матчу
Это состояние ответственно за то, чтобы игроки возвращались на свои позиции и останавливались там. Обновим наш класс Athlete:
public class Athlete {.
private var mInitialPosition: Vector3D; // стартовая позиция хоккеиста.
public function Athlete (thePosX :Number, thePosY: Number, theTotalMass: Number, theTeam: FlxGroup) { // (…).
mInitialPosition = new Vector3D (thePosX, thePosY); // указание ИИ состояния 'idle'.
mBrain.pushState (idle); }.
private function prepareForMatch () :void {.
mBoid.steering = mBoid. steering + mBoid. arrive (mInitialPosition, 80);
// нахожусь ли я в своей начальной позиции?
if (distance (mBoid.position, mInitialPosition) <= 5) {.
// я в своей стартовой позиции.
mBrain.popState ();
mBrain.pushState (idle); } } // (…) }.
Ниже вы сможете увидеть результат добавления ИИ в игру. Нажмите клавишу G и игроки переместятся в случайные позиции. Затем они встанут на нужные места: