Немного для TDS
| |
CHROM | Дата: Понедельник, 01 Августа 2011, 21:48 | Сообщение # 1 |
частый гость
Сейчас нет на сайте
| 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 пикселей в направлении цели. С проверкой он сдвинется точно к позиции цели, не перескакивая её.
2.Если противники должны двигаться к игроку, огибая стены, можно использовать следующий код:
Код:
if instance_exists(объект_игрока)
{
if point_distance(x, y, объект_игрока.x, объект_игрока.y) > скорость_движения
{
mp_potential_step(объект_игрока.x, объект_игрока.y, скорость_движения, checkall);
}
else
{
x = объект_игрока.x;
y = объект_игрока.y;
}
}
О значении последнего аргумента (checkall) читайте в справке.
3. Как сделать, чтобы противники "видели" игрока только на определённом расстоянии?
Ответ: Для этого нужно проверить расстояние между игроком и противником, делается это с помощью функции point_distance:
Код:
if instance_exists(объект_игрока)
{
if point_distance(x, y, объект_игрока.x, объект_игрока.y) < радиус_зрения_противника
{
// Действия противника, когда игрок попал в поле зрения.
}
}
О необходимости проверки instance_exists читайте в предыдущем вопросе.
4. Как сделать, чтобы противники видели игрока только под определённым углом?
Ответ: Используйте скрипт для вычисления разницы между двумя направлениями, создание которого подробно описывается в вопросе 2.4.24. Если разница между направлением взгляда противника и направлением от него к игроку превышает половину от угла обзора противника, значит противник не видит игрока. К примеру, если противник имеет угол обзора в 120 градусов, то разница между направлением его взгляда и направлением от него к игроку должна по модулю не превышать 60 градусов (это значит, что противник видит игрока). В коде это выглядит примерно так:
Код:
var dir;
dir = point_direction(x, y, объект_игрока.x, объект_игрока.y);
if abs(dir_difference(image_angle, dir)) <= угол_обзора / 2
{
// Действия противника, если игрок находится в его поле зрения.
}
5. Как сделать, чтобы противники не видели игрока через стены?
Ответ: Для этого нужно проверить, есть ли между противником и игроком стена. Используйте функцию collision_line:
Код:
if instance_exists(объект_игрока) // Если объект игрока существует
{
if !collision_line(x, y, объект_игрока.x, объект_игрока.y, объект_стены, 0, 0)
{
// Действия противника, когда между ним и игроком нет стены.
}
}
Восклицательный знак перед функцией - это знак отрицания, то есть, он сменяет true на false и false на true. Иначе говоря, без него проверка на русском языке звучала бы как "Если между игроком и противником есть стена", а с ним: "Если между игроком и противником нет стены".
6. Как сделать, чтобы противник двигался за ближайшим союзным персонажем игрока, или к самому игроку (если он ближе всех)?
Ответ: Так как объектов союзных персонажей может быть много, нам нужно обращаться к какому-то одному объекту, а не к каждому по отдельности. Для этого нужно использовать так называемых объектов-родителей (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;
}
}
Пишите если чё непонятно...)
+ CHROM +
|
|
| |
AGENTX001 | Дата: Понедельник, 01 Августа 2011, 23:15 | Сообщение # 2 |
почётный гцупер
Сейчас нет на сайте
| Этих "уроков", больше чем сказок в "Тысяча и одна ночь"... Тупое репонабивание....
|
|
| |
CHROM | Дата: Понедельник, 01 Августа 2011, 23:48 | Сообщение # 3 |
частый гость
Сейчас нет на сайте
| для новичков будет полезно!
+ CHROM +
|
|
| |
GameMix | Дата: Вторник, 02 Августа 2011, 05:26 | Сообщение # 4 |
старожил
Сейчас нет на сайте
| AGENTX001, я даже больше скажу, это не уроки! А просто копипаст! Открой FAQ по Game Maker и прочти главу "ИИ". Весь код от и до скопирован!
CHROM, ты бы хоть комменты свои написал или изменил их чуток. А то от первой буквы до последней скопировал! В общем, или пиши свои уроки или вообще не пиши!
Steel Standoff - 2D аркада. Мои статьи
|
|
| |
SalahAdDin | Дата: Вторник, 02 Августа 2011, 10:14 | Сообщение # 5 |
постоянный участник
Сейчас нет на сайте
| Вот мне интересно. Я покопался в разделе и нашел тонны, если не килотонны уроков для новичков. Когда же кто нибудь напишет более менее сложные уроки для продвинутых пользователей и поделится опытом с профессионалами? Почему никто не затрагивает сложный ии, продвинутые алгоритмы движения, сложную ролевую систему, да мало ли что. Проблемных вопросов хватает, но за них никто не берется. А эти уроки для новичков по сути просто бесполезны, no skill for that.
Фотошоп это не сложно. Немного теории, полезной на практике: Работа с наложением текстур Рисуем без планшета
|
|
| |
AGENTX001 | Дата: Вторник, 02 Августа 2011, 10:21 | Сообщение # 6 |
почётный гцупер
Сейчас нет на сайте
| Quote (аТнОтХоАн) AGENTX001, я даже больше скажу, это не уроки! А просто копипаст! Открой FAQ по Game Maker и прочти главу "ИИ". Весь код от и до скопирован! Я подозревал, но было влом проверить... CHROM, эх ты...
|
|
| |
MyACT | Дата: Суббота, 06 Августа 2011, 07:22 | Сообщение # 7 |
C# CODERS
Сейчас нет на сайте
| И зачем это?
3дэшечки: https://sketchfab.com/myactyindie Курентли воркс он: https://myacty.itch.io/raskopnik
|
|
| |
as3011 | Дата: Понедельник, 08 Августа 2011, 19:59 | Сообщение # 8 |
частый гость
Сейчас нет на сайте
| в следующий раз пиши сам, репу минусовать не буду , но учти: пишешь сам- +в репу; копипастишь- - в репу. Что лучше?
|
|
| |
BrightSpot | Дата: Четверг, 11 Августа 2011, 07:56 | Сообщение # 9 |
заслуженный участник
Сейчас нет на сайте
| Quote (аТнОтХоАн) Открой FAQ по Game Maker и прочти главу "ИИ" епт уже пару лет на ГМ-е сижу, а такой главы в справке не видел поход нужно чаще туда заглядывать=)))Добавлено (11.08.2011, 07:56) --------------------------------------------- эм... не нашел=(
Более мощный компьютер глючит быстрее и точнее.
|
|
| |
GameMix | Дата: Четверг, 11 Августа 2011, 08:14 | Сообщение # 10 |
старожил
Сейчас нет на сайте
| BrightSpot, FAQ != Справка.
Steel Standoff - 2D аркада. Мои статьи
|
|
| |
Леонид | Дата: Четверг, 05 Апреля 2012, 19:33 | Сообщение # 11 |
постоянный участник
Сейчас нет на сайте
| ОГРОМНОЕ СПАСИБО)
|
|
| |
FadeBaker | Дата: Четверг, 05 Апреля 2012, 20:20 | Сообщение # 12 |
JavaSE Game Developer
Сейчас нет на сайте
| CHROM, делать тебе нечего.
Уроки по GM Minecraft 2D на GM — Мои проекты — Blood Harvest [2D] — Original Blood Harvest [2D]: Remastered Edition Adventure Craft [2D] — Sandbox Space Shock [2D] — Scroll Shooter Intel® Core™ i5-3570K 3.40 GHz, 8 GB RAM, GeForce GTX 750 Ti, Monitor: LG 23EA63V-P.
|
|
| |
Laush | Дата: Четверг, 05 Апреля 2012, 20:30 | Сообщение # 13 |
почти ветеран
Сейчас нет на сайте
| Полностю из FAQ Передрал ты,Даже ссылку на их сайт неоставил!!
[PC/Android/iOS/WEB] 30 Days to survive [PC] Dead Defense [PC] Саламандра - история пирата
|
|
| |
ress | Дата: Понедельник, 09 Апреля 2012, 17:00 | Сообщение # 14 |
постоянный участник
Сейчас нет на сайте
| Quote (Laush) Полностю из FAQ Передрал ты,Даже ссылку на их сайт неоставил!! Из какого FAQ? Я не находил. Дашь ссылочку?
Quote (CHROM) для новичков будет полезно! Да, но это их ничему не научит. Просто они будут знать где если что стырить кусочек кода.
Я очень недоволен...
|
|
| |
stalker5889 | Дата: Вторник, 10 Апреля 2012, 10:46 | Сообщение # 15 |
Свободный игродел
Сейчас нет на сайте
| Quote (CHROM) var dir;
dir = point_direction(x, y, объект_игрока.x, объект_игрока.y);
if abs(dir_difference(image_angle, dir)) <= угол_обзора / 2
{
// Действия противника, если игрок находится в его поле зрения.
} Во-первых это наглый копипастинг, слово в слово. Во-вторых - ты хоть сам знаешь что я выделил красным??? Хоть бы код скомпилировал. P.S красным выделен скрипт. Даже в FAQ он не приведён, видимо забыли
|
|
| |
|