АДМИН | Дата: Среда, 2012/Авг/15, 13:44 | Сообщение # 1 |
Группа: Администрация
Сообщений: 62
Статус: 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, скорость_пули); // Направляем её к противнику. } } | |
|
Создатель сайта!!!!
|
|
| |