Rambler's Top100

 GDsW - Game Developer's World    

.: Передвижения врагов :.


Передвижения врагов

Designed and maintained by Lennart Steinke 
Перевод - Aidamir Taimasukov aidamir@chat.ru


Преследование и Уклонение
-------------------------
Наиболее простой способ преследовать игрока - двигаться непосредственно к нему, наиболее простой способ избежать его - двигаться в противоположном направлении. Очень простой алгоритм, который может использоваться, если не имеется никаких препятствий, изложен ниже. Этот алгоритм действительно прост. Он только сравнивает две позиции (позиция монстра и позиции игрока, например), и возвращает направление движения. Если имеются стены, монстр постоянно тыкался бы них, если игрок с другой стороны. 

#define SIGN(x) ( (x)<0 ? -1 : 1)

int GetDir(int Hunter, int Game, int Evade)
{
    if (Hunter == Game)
    return 0;

    int i =SIGN(HunterX - GameX);
    if (evade)
        return (i* (-1));
    else
        return i;
}

/* and somewhere in the game loop */

/* Monster chases the player if the
* last param is 0, set it to 1, if you want
* the monster to evade the player
*/
MoveX= GetDir(MonsterX, PlayerX, 0);
MoveY= GetDir(MonsterX, PlayerX, 0);

Патруль монстров
----------------
Некоторые хорошие Jump'n'Runs допускают перемещение монстров из точки A, в точку B, затем к C и так далее; последняя отметка соединяется обратно с первой. Это не намного сложнее алгоритма преследования, объясненного выше, единственое различие, что монстры "преследуют" waypoint-s а не игрока. 

Нало лишь проверять, достиг ли монстр следующего waypoint, и назначать следующий waypoint.

typedef struct
{
    int x, y;
}
TWaypoint;

/* And somewhere in the programm ... */

monster.ActWayPoint = 0;

/* ...
*/

/* While waypoint not reached */ Пока не достигои конца пути
while (! check(monster.Position, monster.WayPoint[ActWayPoint]))
{
    /* Move into the direction of the next waypoint */
    monster.Position.x += GetDir(
monster.Position.x, monster.WayPoint[ActWayPoint].x, 0)*speed_x;
    monster.Position.y += GetDir(
monster.Position.y, monster.WayPoint[ActWayPoint].y, 0)*speed_y;
    Сдинуться в этом напрвалении
}

/* Set the next waypoint as target */
monster.ActWayPoint++;
monster.ActWayPoint %= monster.CountWayPoints;


Обман - отслеживание игрока
---------------------------
Очень эффективный способ находить игрока мог бы быть, чтобы использовать " терминаторов", некоторых агрессивных, малые созданий, которые могут следовать за следом игрока (если они не были бы малы, игра будет очень несправедлива). Вы могли бы сохранять направление перемещения игрока, поскольку он стоял последний раз в некоторой позиции как атрибут этой позиции. Это дало бы возможность "терминатору" проследить игрока весьма эффективно. (Этот вид алгоритма используется в игре pacman).

Если "терминаторы" быстрее чем игрок, они могли бы действительно быть кошмаром. Вообразите, что они могли бы "вызывать" других, как только они могут "видеть" игрока =)


главная ] Общеигровые статьи на GDsW ] DirectX ] Статьи по графике ] Статьи по AI ] Юмор ]


.: Передвижения врагов :.

Rambler's Top100 Рейтинг@Mail.ru List.ru - каталог ресурсов интернет Белорусский каталог BelResource

Copyright IRsoft, web-master Keeper. All rights reserved!

Хостинг от uCoz