Мне никогда не нравился стелс на мейкере, где поле зрения врага - квадрат.
По мне так намного реалистичнее зрения врага в виде конуса
1 ШАГ. Делаем ограничение зрения в зависимости от направления взора врага
Нарисовал табличку в Эксель с координатами для более ясного представления ситуации.
Спойлер ек:
Зелёный квадратик - враг. Он смотрит вверх. Голубые поля - область взора врага.
Тут всё просто. Следует определить направления события, затем проверить, стоит ли Игрок в этом голубом поле зрения врага.
1) Создаем условие "Если событие "враг" смотрит вверх,то...
2) внутри него создаем ветвление "если координата У(игрек) игрока МЕНЬШЕ или РАВНО координаты У Врага, то..." (не забываем что У начинается сверху вниз, как и в Эксель).
Для удобства ветвление пишем скриптом
ДЛЯ ЭЙСА:
ДЛЯ МВ:$game_player.y<=$game_map.events[1].y
,где
$game_player.y - координата игрока по У.
$game_map.events[1].y - координата события 1 (врага) по У.
3) Внутри него создаем "показать эмоцию Врага - Восклицательный знак" - так мы будем видеть что Враг видит Игрока$gamePlayer.y <= $gameMap.event(this._eventId).y
, где
$game_player.y - координата игрока по У.
$game_map.events[1].y - координата ЭТОГО события по У
Вместо эмоции или после нее можно добавить локальный переключатель А, чтобы запустилось какое-либо поведение врага.
4) Не забываем поставить в событии триггер ПАРАЛЛЕЛЬНО
Ну и для удобства подпишем комментарий "вверх", чтобы не запутаться
Спойлер ке:
2 ШАГ. Делаем ограничение зрения в зависимости от дальности взора врага
То есть Враг не видит игрока если он стоит далеко. Если вы не хотите делать данное ограничение то просто пропускаем этот шаг.
Спойлер рн:
Для простоты и удобства пока рассмотрим небольшую дальность зрения Врага. Напрмиер как на этом рисунке. Красный квадратик находится вне зрения врага но если он будет в голубом поле то Враг его увидит, а точнее на расстоянии 5 клеток или менее
Здесь тоже всё элементарно.
1) Если координата Игрока на 5 или более клеток отличается от координаты Врага,то...
То есть "координата Врага по У минус 5 должно быть МЕНЬШЕ или РАВНО координаты Игрока, чтобы Враг его увидел
ДЛЯ ЭЙСА
ДЛЯ МВ$game_map.events[1].y-5<=$game_player.y
В зависимости от дальности врага число 5 меняем ну нужное число дальнсоти клеток.$gameMap.event(this._eventId).y-5<=$gamePlayer.y
2) Для удобства эту строчку кода вписываем в ветвление,которое у нас было ранее. Так как оба условия должны выполняться,то между этими условиями ставим союз и,т.е. &&
Получится:
ДЛЯ ЭЙСА
ДЛЯ МВ$game_player.y<=$game_map.events[1].y&&$game_map.events[1].y-5<=$game_player.y
3 ШАГ. Делаем ограничение зрения врага "по ширине"$gamePlayer.y <= $gameMap.event(this._eventId).y&&$gameMap.event(th is._eventId).y-5<=$gamePlayer.y
Тут всё просто. Координаты героя должны быть в интервале 6 клеток от врага по правую и левую сторону от него.
То есть Координата игрока должна быть меньше или равна координате врага+6 И большее или равно координате врага-6
ДЛЯ ЭЙСА
ДЛЯ МВ($game_player.y<=$game_map.events[1].x+6)&&($game_player.y>=$game_map.events[1].x-6)
4 ШАГ. Делаем конусовидное ограничение зрения врага($gamePlayer.x <= $gameMap.event(this._eventId).x+6)&&($gamePlayer.x >= $gameMap.event(this._eventId).x-6)
Решил что поле зрения Врага должен быть вот такой конус:
Спойлер рек:
И вот тут начинается самое мозголомное. Конечно, можно перебрать ВСЕ клетки,входящие в данный конус описанными выше способами наподобие с координатой по У. Но тогда получится кучу условий, а ведь если мы хотим сделать дальность врага в 9 клеток и более то конус будет совсем огромный.
Приходится искать другое решение. Напишем координаты данных клеток относительно координат Врага и попробуем найти их закономерность. Х - координата Х Врага, У - координата У врага.
Спойлер рн:
Замечаем, что у клеток,находящихся на самой левой диагонали (выделил красной стрелкой) координата Х МЕНЬШЕ координаты У на 1.
То есть если их Х вычесть У то получится -1.
У диагонали которая находится чуть правее (отметил синей стрелкой) координата Х РАВНА координате У.
То есть если их Х вычесть У то получится 0
У диагонали зеленой стрелкой если вычесть Х то получится 1.
Получается, что если эта разница будет БОЛЬШЕ ИЛИ РАВНО -1, то Враг будет видеть эту клетку.
1) Значит получается условие "если координата Х игрока минус координата Х врага будет больше или равно на "-1" разницы между координатами по У игрока и врага то.."
ДЛЯ ЭЙСА
ДЛЯ МВ($game_player.x-$game_map.events[1].x)-($game_player.y-$game_map.events[1].y)>=-1
2) Совмещаем эти строчки кода с тем что было на шаге 1-2 с помощью союза "и" - &&. Также совмещаем это с тем что было на шаге 3,однако так как это наше выражение верно для ЛЕВОЙ стороны конуса то ограничение по ИКС немного меняется, и становится "от координата врага-6 до координаты врага"($gamePlayer.x - $gameMap.event(this._eventId).x)-
($gamePlayer.y - $gameMap.event(this._eventId).y)>=-1
ДЛЯ ЭЙСА
($game_player.y<=$game_map.events[1].y&&$game_map.events[1].y-ДЛЯ МВКод HTML:5<=$game_player.y)&&($game_player.y<=$game_map.events[1].x)&&($game_player.y>=$game_map.events[1].x-6)&&(($game_player.x-$game_map.events[1].x)-($game_player.y-$game_map.events[1].y)>=-1)
3) А что делать с правой стороной этого конуса?Код HTML:($gamePlayer.y <= $gameMap.event(this._eventId).y&&$gameMap.event(this._eventId).y-5<=$gamePlayer.y)&&($game_player.y<=$game_map.events[1].x)&&($game_player.y>=$game_map.events[1].x-6)&&(($gamePlayer.x - $gameMap.event(this._eventId).x)- ($gamePlayer.y - $gameMap.event(this._eventId).y)>=-1)
Спойлер рн:
Замечаем что координаты с правой стороны полностью идентичны координатам слева, только Х меняет свой знак с плюса на МИНУС. Значит чтобы определить координаты конуса слева необходимо умножить координату Х на -1, сделав ее отрицательной. Вот и всё.
($game_player.x-$game_map.events[1].x)*(-1)-($game_player.y-$game_map.events[1].y)>=-14) Теперь необходимо создать еще одно ветвление,в котором мы совмещаем 2 шаг с правой стороной конуса. Поулчится то же самое,что было на 1-2 пунктах 3-его шага,только добавится "*(-1)" и сменится интервал для ИКС($gamePlayer.x - $gameMap.event(this._eventId).x)*(-1)-
($gamePlayer.y - $gameMap.event(this._eventId).y)>=-1
ДЛЯ ЭЙСА
ДЛЯ МВКод HTML:($game_player.y<=$game_map.events[1].y&&$game_map.events[1].y-5<=$game_player.y)&&($game_player.y<=$game_map.events[1].x+6)&&($game_player.y>=$game_map.events[1].x)&&(($game_player.x-$game_map.events[1].x)*(-1)-($game_player.y-$game_map.events[1].y)>=-1)
Получится вот такое небольшое ветвление,а конкретнее - одно ветвление с левой стороной конуса при смотре врага верх и второе ветвление - с парвой стороной конусаКод HTML:($gamePlayer.y <= $gameMap.event(this._eventId).y&&$gameMap.event(this._eventId).y-5<=$gamePlayer.y)&&($game_player.y>=$game_map.events[1].x)&&(($gamePlayer.x - $gameMap.event(this._eventId).x+6)&&(($gamePlayer.x - $gameMap.event(this._eventId).x)*(-1)- ($gamePlayer.y - $gameMap.event(this._eventId).y)>=-1)
Спойлер кре:
ВОТ И ВСЁ. Так много текста и трудов и так мало ветвлений в событии.
Остаётся то же самое сделать со всеми четырьмя сторонами.
Небольшая подсказка: Копируем тот код,что мы сделали,только меняем слагаемые в нужных местах для смены знаков.
Еще несколько подсказок для регулирования зрения Врагов.
1) Регулирование длины зрения врага,путем замены всего одной цифры. На втором шаге вместо 5 можно написать любое число, хоть сотню - конус по-прежнему будет рбаотать.
2) Легко расширить конус или сузить. Меняем -1 на 0 и получается более узкий конус
3) Можно сделать чтоб Враг слышал вас если вы подошли сзади слишком близко. Для этого меняем первый шаг на
$game_player.y<=$game_map.events[1].y+1
Демка, надеюсь все ссылки работают
ДЛЯ МВ полностью так как в этом уроке
https://yadi.sk/d/_8OpOa97rYyCY
ДЛЯ ЭЙСА с немного другим алгоритмом
drive.google.com/file/d/0Bw4hr3sRpc83WVg...b0k/view?usp=sharing
Задатки того,как сделать "прятки" за укрытиями есть в этом моем посте на светлой, но сейчас эта система дорабатывается, урок не знаю напишу ли
http://rpg-maker.info/forum/fakultet...start=20#89736
Социальные закладки