[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Искуственный интелект (game maker)
Искуственный интелект
АДМИНДата: Среда, 2012/Авг/15, 13:44 | Сообщение # 1
Группа: Администрация
Сообщений: 62
Награды: 6
Репутация: 9
Статус: Offline


2.6.1. Как сделать, чтобы противники двигались к игроку? (вид сверху)






 


Ответ: Заставить противников двигаться к игроку есть множество способов. Если противники должны просто следовать за игроком по прямой, можно использовать следующий код:


Код:






 


if instance_exists(объект_игрока)


{


   if point_distance(x, y, объект_игрока.x, объект_игрока.y) > скорость_движения


   {


       move_towards_point(объект_игрока.x, объект_игрока.y, скорость_движения); // Двигаемся к игроку


   }


   else


   {


       x = объект_игрока.x;


       y = объект_игрока.y;


   }


}


 




 


Условие if instance_exists(объект_игрока) нужно для того, чтобы не появлялась ошибка, когда объекта игрока почему-то нет (например, когда он был удалён после смерти). Проверка point_distance требуется для того, чтобы противник не мог пройти позицию цели. К примеру, если скорость противника - 10 пикселей, а цель находится от него на расстоянии в два пикселя, то он попросту проскочит её, сдвинувшись на 10 пикселей в направлении цели. С проверкой он сдвинется точно к позиции цели, не перескакивая её.


 


Если противники должны двигаться к игроку, огибая стены, можно использовать следующий код:


Код:






 


if instance_exists(объект_игрока)


{


   if point_distance(x, y, объект_игрока.x, объект_игрока.y) > скорость_движения


   {


       mp_potential_step(объект_игрока.x, объект_игрока.y, скорость_движения, checkall);


   }


   else


   {


       x = объект_игрока.x;


       y = объект_игрока.y;


   }


}


 




 


О значении последнего аргумента (checkall) читайте в справке.


 


 




2.6.2. Зарезервировано.


2.6.3. Зарезервировано.


2.6.4. Зарезервировано.


2.6.5. Зарезервировано.


2.6.6. Зарезервировано.


2.6.7. Как сделать, чтобы противники "видели" игрока только на определённом расстоянии?






 


Ответ: Для этого нужно проверить расстояние между игроком и противником, делается это с помощью функции point_distance:


Код:






 


if instance_exists(объект_игрока)


{


   if point_distance(x, y, объект_игрока.x, объект_игрока.y) < радиус_зрения_противника


   {


       // Действия противника, когда игрок попал в поле зрения.


   }


}


 




 


О необходимости проверки instance_exists читайте в предыдущем вопросе.


 


 




2.6.8. Как сделать, чтобы противники видели игрока только под определённым углом?






 


Ответ: Используйте скрипт для вычисления разницы между двумя направлениями, создание которого подробно описывается в вопросе 2.4.24. Если разница между направлением взгляда противника и направлением от него к игроку превышает половину от угла обзора противника, значит противник не видит игрока. К примеру, если противник имеет угол обзора в 120 градусов, то разница между направлением его взгляда и направлением от него к игроку должна по модулю не превышать 60 градусов (это значит, что противник видит игрока). В коде это выглядит примерно так:


Код:






 


var dir;


dir = point_direction(x, y, объект_игрока.x, объект_игрока.y);


if abs(dir_difference(image_angle, dir)) <= угол_обзора / 2


{


   // Действия противника, если игрок находится в его поле зрения.


}


 




 


 




2.6.9. Как сделать, чтобы противники не видели игрока через стены?






 


Ответ: Для этого нужно проверить, есть ли между противником и игроком стена. Используйте функцию collision_line:


Код:






 


if instance_exists(объект_игрока) // Если объект игрока существует


{


   if !collision_line(x, y, объект_игрока.x, объект_игрока.y, объект_стены, 0, 0)


   {


       // Действия противника, когда между ним и игроком нет стены.


   }


}


 




 


Восклицательный знак перед функцией - это знак отрицания, то есть, он сменяет true на false и false на true. Иначе говоря, без него проверка на русском языке звучала бы как "Если между игроком и противником есть стена", а с ним: "Если между игроком и противником нет стены".


 


 




2.6.10. Как сделать, чтобы противник двигался за ближайшим союзным персонажем игрока, или к самому игроку (если он ближе всех)?






 


Ответ: Так как объектов союзных персонажей может быть много, нам нужно обращаться к какому-то одному объекту, а не к каждому по отдельности. Для этого нужно использовать так называемых объектов-родителей (parent). Для начала нужно создать новый объект, родитель для всех союзных персонажей игрока и для него самого, после чего назначить его родителем всем нужным объектам. При обращении к родителю мы будем обращаться ко всем его дочерним объектам - ко всем союзным персонажам и игроку одновременно.


Для определения ближайшего объекта можно использовать функцию instance_nearest. Если ни одного экземпляра искомого объекта в комнате нет, функция возвратит noone, поэтому функцию instance_exists можно не использовать. Код будет выглядеть примерно так:


Код:






 


var obj;


obj = instance_nearest(x, y, родительский_объект); // Определяем ближайшего персонажа


if obj != noone // Если существует хотя бы один экземпляр объекта родительский_объект (или дочернего объекта), то...


{


   /// Двигаемся к нему:


   if point_distance(x, y, obj.x, obj.y) > скорость_движения


   {


       mp_potential_step(obj.x, obj.y, скорость_движения, checkall);


   }


   else


   {


       x = obj.x;


       y = obj.y;


   }


}


 




 


 




2.6.11.  Как сделать, чтобы башня стреляла в ближайшего противника (речь о жанре "Башенная защита")?






 


Ответ: Код будет практически аналогичен тому, который представлен в предыдущем вопросе:


Код:






 


var obj;


obj = instance_nearest(x, y, объект_противника); // Определяем ближайшего противника.


if obj != noone // Если существует хотя бы один противник, то...


{


   var bull;


   bull = instance_create(x, y, объект_пули); // Создаём пулю.


   with bull


   {


       move_towards_point(obj.x, obj.y, скорость_пули); // Направляем её к противнику.


   }


}


 




 


 




 





Создатель сайта!!!!
 
Форум » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Искуственный интелект (game maker)
  • Страница 1 из 1
  • 1
Поиск: