Плохо! Плохо!:  0
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 15

Тема: Стелс на ивентах

  1. #1
    Маститый Аватар для Yuryol
    Информация о пользователе
    Регистрация
    06.03.2014
    Адрес
    Красноярск
    Сообщений
    1,420
    Записей в дневнике
    44
    Репутация: 60 Добавить или отнять репутацию

    По умолчанию Стелс на ивентах

    Мне никогда не нравился стелс на мейкере, где поле зрения врага - квадрат.
    По мне так намного реалистичнее зрения врага в виде конуса



    1 ШАГ. Делаем ограничение зрения в зависимости от направления взора врага
    Нарисовал табличку в Эксель с координатами для более ясного представления ситуации.

    Спойлер ек:


    Зелёный квадратик - враг. Он смотрит вверх. Голубые поля - область взора врага.
    Тут всё просто. Следует определить направления события, затем проверить, стоит ли Игрок в этом голубом поле зрения врага.

    1) Создаем условие "Если событие "враг" смотрит вверх,то...

    2) внутри него создаем ветвление "если координата У(игрек) игрока МЕНЬШЕ или РАВНО координаты У Врага, то..." (не забываем что У начинается сверху вниз, как и в Эксель).

    Для удобства ветвление пишем скриптом
    ДЛЯ ЭЙСА:
    $game_player.y<=$game_map.events[1].y
    ,где
    $game_player.y - координата игрока по У.
    $game_map.events[1].y - координата события 1 (врага) по У.
    ДЛЯ МВ:
    $gamePlayer.y <= $gameMap.event(this._eventId).y
    , где
    $game_player.y - координата игрока по У.
    $game_map.events[1].y - координата ЭТОГО события по У
    3) Внутри него создаем "показать эмоцию Врага - Восклицательный знак" - так мы будем видеть что Враг видит Игрока
    Вместо эмоции или после нее можно добавить локальный переключатель А, чтобы запустилось какое-либо поведение врага.
    4) Не забываем поставить в событии триггер ПАРАЛЛЕЛЬНО

    Ну и для удобства подпишем комментарий "вверх", чтобы не запутаться

    Спойлер ке:


    2 ШАГ. Делаем ограничение зрения в зависимости от дальности взора врага

    То есть Враг не видит игрока если он стоит далеко. Если вы не хотите делать данное ограничение то просто пропускаем этот шаг.

    Спойлер рн:


    Для простоты и удобства пока рассмотрим небольшую дальность зрения Врага. Напрмиер как на этом рисунке. Красный квадратик находится вне зрения врага но если он будет в голубом поле то Враг его увидит, а точнее на расстоянии 5 клеток или менее
    Здесь тоже всё элементарно.
    1) Если координата Игрока на 5 или более клеток отличается от координаты Врага,то...
    То есть "координата Врага по У минус 5 должно быть МЕНЬШЕ или РАВНО координаты Игрока, чтобы Враг его увидел
    ДЛЯ ЭЙСА
    $game_map.events[1].y-5<=$game_player.y
    ДЛЯ МВ
    $gameMap.event(this._eventId).y-5<=$gamePlayer.y
    В зависимости от дальности врага число 5 меняем ну нужное число дальнсоти клеток.
    2) Для удобства эту строчку кода вписываем в ветвление,которое у нас было ранее. Так как оба условия должны выполняться,то между этими условиями ставим союз и,т.е. &&
    Получится:
    ДЛЯ ЭЙСА
    $game_player.y<=$game_map.events[1].y&&$game_map.events[1].y-5<=$game_player.y
    ДЛЯ МВ
    $gamePlayer.y <= $gameMap.event(this._eventId).y&&$gameMap.event(th is._eventId).y-5<=$gamePlayer.y
    3 ШАГ. Делаем ограничение зрения врага "по ширине"

    Тут всё просто. Координаты героя должны быть в интервале 6 клеток от врага по правую и левую сторону от него.
    То есть Координата игрока должна быть меньше или равна координате врага+6 И большее или равно координате врага-6

    ДЛЯ ЭЙСА
    ($game_player.y<=$game_map.events[1].x+6)&&($game_player.y>=$game_map.events[1].x-6)
    ДЛЯ МВ
    ($gamePlayer.x <= $gameMap.event(this._eventId).x+6)&&($gamePlayer.x >= $gameMap.event(this._eventId).x-6)
    4 ШАГ. Делаем конусовидное ограничение зрения врага
    Решил что поле зрения Врага должен быть вот такой конус:

    Спойлер рек:


    И вот тут начинается самое мозголомное. Конечно, можно перебрать ВСЕ клетки,входящие в данный конус описанными выше способами наподобие с координатой по У. Но тогда получится кучу условий, а ведь если мы хотим сделать дальность врага в 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
    ДЛЯ МВ
    ($gamePlayer.x - $gameMap.event(this._eventId).x)-
    ($gamePlayer.y - $gameMap.event(this._eventId).y)>=-1
    2) Совмещаем эти строчки кода с тем что было на шаге 1-2 с помощью союза "и" - &&. Также совмещаем это с тем что было на шаге 3,однако так как это наше выражение верно для ЛЕВОЙ стороны конуса то ограничение по ИКС немного меняется, и становится "от координата врага-6 до координаты врага"

    ДЛЯ ЭЙСА
    ($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)
    ДЛЯ МВ
    Код 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)
    3) А что делать с правой стороной этого конуса?

    Спойлер рн:


    Замечаем что координаты с правой стороны полностью идентичны координатам слева, только Х меняет свой знак с плюса на МИНУС. Значит чтобы определить координаты конуса слева необходимо умножить координату Х на -1, сделав ее отрицательной. Вот и всё.

    ($game_player.x-$game_map.events[1].x)*(-1)-($game_player.y-$game_map.events[1].y)>=-1
    ($gamePlayer.x - $gameMap.event(this._eventId).x)*(-1)-
    ($gamePlayer.y - $gameMap.event(this._eventId).y)>=-1
    4) Теперь необходимо создать еще одно ветвление,в котором мы совмещаем 2 шаг с правой стороной конуса. Поулчится то же самое,что было на 1-2 пунктах 3-его шага,только добавится "*(-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

  2. #2
    Познающий Аватар для Amur_87
    Информация о пользователе
    Регистрация
    28.09.2014
    Адрес
    ДВ, Амурская область
    Сообщений
    316
    Записей в дневнике
    3
    Репутация: 27 Добавить или отнять репутацию

    По умолчанию

    Yuryol, а можешь потом запилить версию полностью готовую, с абс и стелс вместе?

  3. #3
    Маститый Аватар для Yuryol
    Информация о пользователе
    Регистрация
    06.03.2014
    Адрес
    Красноярск
    Сообщений
    1,420
    Записей в дневнике
    44
    Репутация: 60 Добавить или отнять репутацию

    По умолчанию

    Цитата Сообщение от Amur_87 Посмотреть сообщение
    Yuryol, а можешь потом запилить версию полностью готовую, с абс и стелс вместе?
    так а че там пилить-то. Берешь копируешь событие врага в демку с абс и всё. тут всё в одном событии и переменных и переключателей нет

  4. #4
    Местный Аватар для CEight
    Информация о пользователе
    Регистрация
    27.04.2016
    Адрес
    Астероид администраторский
    Сообщений
    159
    Репутация: 10 Добавить или отнять репутацию

    По умолчанию

    А если герой прячется в кустах или за стеной, но он находится в поле зрения, как тут быть? И спасибо за разрешение, некоторых вопросов.

  5. #5
    Маститый Аватар для Yuryol
    Информация о пользователе
    Регистрация
    06.03.2014
    Адрес
    Красноярск
    Сообщений
    1,420
    Записей в дневнике
    44
    Репутация: 60 Добавить или отнять репутацию

    По умолчанию

    Цитата Сообщение от CEight Посмотреть сообщение
    А если герой прячется в кустах или за стеной, но он находится в поле зрения, как тут быть? И спасибо за разрешение, некоторых вопросов.
    В конце 1-ого поста написано
    Задатки того,как сделать "прятки" за укрытиями есть в этом моем посте на светлой, но сейчас эта система дорабатывается, урок не знаю напишу ли
    Просто копировать тот урок не хочу потмоу что система укрытия с косяками,поэтому пока еще развиваю этот момент. Как достаточно потестю и всё устроит попробую написать урок

  6. #6
    Авторитет Аватар для Bloody
    Информация о пользователе
    Регистрация
    22.04.2008
    Сообщений
    1,752
    Записей в дневнике
    94
    Репутация: 36 Добавить или отнять репутацию

    По умолчанию

    Я на эвентах давно уже собрал стелс-систему с прятаньем в шкафах, ящиках и т.д. и т.п., но на сам проект забил (временно, надеюсь), а не написать туториал мне помогла лень (мой главный спонсор вообще всего), поэтому Yurol'у честь и хвала. Туториалы штука нужная.
    Проекты:
    Мини-игры: El Presidente -- Red & Blue -- Roll Me Away -- Wizard's Revenge
    На перерыве: Mémoire
    Кажется, заброшены: Street Magic -- Hack in the Dark

  7. #7
    Маститый Аватар для Yuryol
    Информация о пользователе
    Регистрация
    06.03.2014
    Адрес
    Красноярск
    Сообщений
    1,420
    Записей в дневнике
    44
    Репутация: 60 Добавить или отнять репутацию

    По умолчанию

    Цитата Сообщение от Bloody Посмотреть сообщение
    Я на эвентах давно уже собрал стелс-систему с прятаньем в шкафах, ящиках и т.д. и т.п., но на сам проект забил (временно, надеюсь), а не написать туториал мне помогла лень (мой главный спонсор вообще всего), поэтому Yurol'у честь и хвала. Туториалы штука нужная.
    пасиб.
    про прятание в шкафах и ящиках - это легко. Я о другом - чтобы можно было прятаться встав за непроходимый тайл, а не в заранее созданное событие.
    то есть мы должны проверить не находится ли между врагом и событием тайл с определенным кодом местности,для чего проверяем каждую координату между игроком и врагом.
    Получится что-то типа этого



    Только тут вариант с расположением игрока на одной диагонали/вертикали или горизонтали,а как просчитать все остальные случаи когда же из них герой не виден - это щас делается

  8. #8

    По умолчанию

    Yuryol,перезалей пожалуйста,ссылку на демку для Rmk VX ACE

  9. #9
    Маститый Аватар для Yuryol
    Информация о пользователе
    Регистрация
    06.03.2014
    Адрес
    Красноярск
    Сообщений
    1,420
    Записей в дневнике
    44
    Репутация: 60 Добавить или отнять репутацию

    По умолчанию

    Цитата Сообщение от Yros Посмотреть сообщение
    Yuryol,перезалей пожалуйста,ссылку на демку для Rmk VX ACE
    спасибо что заметил. завтра обновлю, сегодня уже до компьютера не доберусь наверное

  10. #10
    Познающий Аватар для Deme
    Информация о пользователе
    Регистрация
    16.05.2014
    Сообщений
    317
    Записей в дневнике
    16
    Репутация: 4 Добавить или отнять репутацию

    По умолчанию

    Цитата Сообщение от Yuryol Посмотреть сообщение
    Только тут вариант с расположением игрока на одной диагонали/вертикали или горизонтали,а как просчитать все остальные случаи когда же из них герой не виден - это щас делается
    Если кому-то интересно, вот тут решение аналогичной задачи для RPG Maker 2000/2003: https://rpgmaker.net/tutorials/479/?post=468605

    Собственно, в новых мейкерах можно использовать тот же принцип: определить угол α = arctg dx/dy, где dx=xгероя-xврага, dy=yгероя-yврага, и пройтись по клеткам типа x=xврага + i*sin α, y = yврага + i*cos α, меняя значение i с маленьким шагом, минимум в клетку, чтобы 0 < i < sqrt(dx2 + dy2).

    Однако в RPG Maker 2000/2003 нет тригонометрических функций: их нужно эмулировать вручную, составив таблицу. Поэтому там всё очень весело
    Последний раз редактировалось Deme; 02.05.2017 в 12:56.
    «quī legis ista, tuam reprehendō, mea laudās // omnia, stultitiam; / nihil, invidiam» (Jōhannis Audoenī)
    'Ты, кто читает это: я порицаю, если ты хвалишь у меня // всё, твою глупость; / если ничего — твою злобу.' (Джон Оуэн)

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
Стелс на ивентах