Зрение монстра на эвентах.

1 место в Готв 3 место Учитель Разработчик 3 место Готв Ветеран Писатель 2 место Тестер
Больше
10 года 3 мес. назад #89689 от Демий

yuryol пишет: На основе чего можно делать проверку проходимости событий?

Code:
$game_map.check_passage(x, y, 0xF) == true

Вот такая вот волшебная формула тебе поможет. ;3 Ну и всё можно было заменить case, но об этом расскажу чуть позже, если возьмусь разбирать по составляющим динамит из Old Castle.
Спасибо сказали: yuryol

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Проект месяца 3 место Проект месяца 1 место Проект месяца 2 место 3 место Готв Победитель Сбитой кодировки Программист JavaScript 2 место Сбитая кодировка Писатель 3 место 2 место 3 место Организатор конкурсов
Больше
10 года 3 мес. назад #89690 от Cerberus
Демий, check_passage как раз на события плюёт. Она проверяет только тайлы.

Жуть болотная, на лапках, в тапках и с пулемётом...
Спасибо сказали: yuryol

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

1 место в Готв 3 место Учитель Разработчик 3 место Готв Ветеран Писатель 2 место Тестер
Больше
10 года 3 мес. назад #89692 от Демий

Cerberus пишет: Демий, check_passage как раз на события плюёт. Она проверяет только тайлы.


Да, сорян, плохо проверил. -_-' Зато твоя строка отлично подходит, проверил сейчас.
Спасибо сказали: yuryol

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
10 года 3 мес. назад - 10 года 3 мес. назад #89736 от yuryol
Продолжаем мучаться со стелсом.
Сначала хотя бы просто попробуем сделать игрока невидимым,если стена находится ниже игрока и выше врага. Как на этом скрине. Красный - местоположения игрока. Коричневые - стены.



1. Сначала попробуем рассмотреть случай, когда игрок стоит вплотную к стенке.
1) Как нам найти координаты данной стенки? Разумно, что необходимо прибавить единицу к координате игрока по У, так как стенка на одну клетку ниже игрока.
$game_player.y+1
Создаем в мейкере переменную "координата стенки по у" и приравниваем ее к скрипту $game_player.y+1
2) Координата стенки по Х будет равной координате игрока, т.е. $game_player.x
Создаем переменную "координата стенки по Х и приравниваем ее к $game_player.x
3) Далее мы должны проверить проходима ли эта клетка. Мейкер должен проверить проходимость этой клетки чтоб понять что это стенка.
Заходим в базу данных, далее наборы тайлов и меняем код местности того тайла,который будет стеной например на цифру 6.



Далее в событии "получить данные о местности" -> вводим новую переменную Код местности-> "из переменных" и вводим наши переменные "координата стенки по х" и "координата стенки по у"
И, наконец, водим ветвление условий "если переменная Код местности равна шести, то..."
4) в общем-то всё. Вводим "показать эмоцию вопросительный знак" чтобы показать что враг нас не видит если мы за стенкой




2. Теперь попробуем рассмотреть случай, когда игрок стоит НЕ вплотную к стенке.
Случай почти такой же как в первом шаге, только нам надо просчитать не только клетку которая на одну клетку ниже игрока,но и также те,которые на ДВЕ,на ТРИ и более клеток ниже.
То есть $game_player.y+1, $game_player.y+2, $game_player.y+3, $game_player.y+4 и т.д. до бесконечности.
Если дальность зрения врага клеток пять то всё это в принципе можно указать в условии. А что делать если дальность врага вообще не ограничена?
1) Введем переменную "счетчик". теперь мы к координате игрока будем прибавлять не число 1 а переменную "счетчик". Создаем ее и пока приравниваем к нулю.
2) Введем цикл. Внутри этого цикла создадим ветвление условий "если переменная код местности равна 6". Тем самым действие будет повторяться до тех пор пока программа не найдет непроходимый тайл
3) Переменная сркиптом записывается как $game_variables[44], где число в квадратной скобке - номер переменной
Поэтому прираниваем переменную "координата стенки по у" не к $game_player.y+1, а к скрипту
$game_player.y+$game_variables[44]
Сначала при первом прохождении цикла она равна нулю. Затем,если код местности равен 6 - ПРЕРЫВАНИЕ ЦИКЛА.
ИЛИ
Увеличиваем переменную счетчик на единицу. И так до тех пор, пока мейкер не найдет тайл с кодом местности 6.
4) А что будет если мейкер так и не найдет непроходимый тайл? правильно,игра зависнет. Поэтому мы должны ограничить переменную счетчик дабы цикл не считался до бесконечности. А ограничием ее дальностью зрения врага. Например, шести.
Внутрь цикла вводим ветвление условий "если перемнная счетчик равна 6 то.." вводим эмоция врага ВОСКЛИЦАНИЕ и "ПРЕРВАТЬ ЦИКЛ"
ИЛИ
копируем всё что мы написали в 3 и 4 шаге.
То есть программа будет считать до тех пор пока не найдет непроходимый тайл или не ограичется дальностью зрения врага.
Получается такая штука



3. Находим баги.
Тестируя демку возникает несколько нестыковочек.



ИГРОК СТОИТ ПРЯМО ПЕРЕД ВРАГОМ но враг его не видит,ведь ниже игрока стоит стенка.
Игрок стоит на одной диагонали с врагом но врг его не видит потому что внизу игрока стенка.

4. Ограничиваем расположение стенок.
Очевидно,что стенка не должна быть вне поля зрения врага,чтобы можно было за нее спрятатья. Она не должна быть сзади или на крайней диагонали конуса, потому что даже чисто зрительно можно понять что за аткими стенками враг должен видеть игрока.
Поэтому ограниваем стенки.
1) координата стенки должна быть выше врага,а значит меньше координаты врага по У.
$game_variables[42]<=$game_map.events[1].y
2) координата стенки должна быть внутри конуса и не на его внешних диагоналях. Даже не на его ДВУХ внешних диагоналях.
Вспоминаем как мы определяли нахождение игрока в зоне видимости. Это было в ТРЕТЬЕМ опдпункте ТРЕТЬЕГО шага моего прошлого поста
($game_player.x-$game_map.events[1].x)*(-1)-($game_player.y-$game_map.events[1].y)>=-1
меняем координаты игрока $game_player.x на координату $game_variables[41]
$game_player.y на координату $game_variables[42]
Чтобы исключить две внешние диагонали слева от врага необходимо чтобы разница координат была больше или равно единице
Поулчается
($game_variables[41]-$game_map.events[1].x)-($game_variables[42]-$game_map.events[1].y)>=1
3) Вспоминаем про правую сторону от врага. Разинцу координат по Х надо умножить на 1 в данном случае
($game_variables[41]-$game_map.events[1].x)*(-1)-($game_variables[42]-$game_map.events[1].y)>=1
В итоге у нас получается вот такое событие



ДЕМКА drive.google.com/file/d/0Bw4hr3sRpc83Sl8...QWc/view?usp=sharing

5. "Прятки" за крайними стенками
Замечаем,что за крайними стенками тоже можно спрятаться. Но не сзади них (точнее выше них), а по диагонали.





Принцип тот же что в при обычных прятках. Только плюс к прибавлению переменной счетчик к Y ОТНИМАЕМ счетчик из координаты по Х
ну и стенку ограничиваем не 1, а -1.
Последнее редактирование: 10 года 3 мес. назад пользователем yuryol.
Спасибо сказали: Демий, Jas6666, Imaginatium, DesKarD

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
10 года 3 мес. назад - 10 года 3 мес. назад #89823 от yuryol


Не сторонник я подобного "зрения". Получается красный кружочки он не увидит, что выглядит довольно странно.



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

P.S. Куда коммент Дескарда делся? Или пора мне прекращать баловаться наркотиками :unsure:
Последнее редактирование: 10 года 3 мес. назад пользователем yuryol.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
10 года 3 мес. назад - 10 года 3 мес. назад #89825 от DesKarD
yuryol, это настраивается судя по описанию скрипта



Но не в таком идеале как это вышло у тебя ;D

Нашёл ещё функцию... Не понимаю что она даёт на самом деле



UPD:
Я вот тут пытался все твои манипуляции в один вызов скрипта сложить.
В общем я немного запутался...

IF $game_player.Y <= $game_map.events[1].Y
DO wait(5)
ELSIF $game_map.events[1].Y - 3 <= $game_player.Y

Дальше получается нужно в DO ветвление условий пилить? Или через ELSIF

Золотой сборник цитат Светлой

Помогите Юриолю потушить его попчанский
Последнее редактирование: 10 года 3 мес. назад пользователем DesKarD.
Спасибо сказали: yuryol

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Проект месяца 3 место Проект месяца 1 место Проект месяца 2 место 3 место Готв Победитель Сбитой кодировки Программист JavaScript 2 место Сбитая кодировка Писатель 3 место 2 место 3 место Организатор конкурсов
Больше
10 года 3 мес. назад #89831 от Cerberus
Ветвление условий в DO (это не синтаксис Руби, ну да ладно) означает "если предыдущее условие верно - проверить это". Ветвление условий в ELSEIF означает "если предыдущее условие неверно - проверить это". Что из этого выбирать - по такому куску кода понять сложно.

Жуть болотная, на лапках, в тапках и с пулемётом...
Спасибо сказали: DesKarD

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Проект месяца 1 место Программист Ruby Писатель 3 место 3 место Учитель Организатор конкурсов 1 место в Готв Ветеран Проект месяца 2 место
Больше
10 года 3 мес. назад #89839 от DeadElf79
Написать ли свой скрипт на основе уроков от юриоля? Или подождать, пока дескард доведет себя до умопомрачения, пытаясь перевести и разобраться в японской версии? Которая, заметьте, совсем не по юриолю и потому для темы не канонична ^_^

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
10 года 3 мес. назад #89840 от yuryol

DeadElf79 пишет: Написать ли свой скрипт на основе уроков от юриоля? Или подождать, пока дескард доведет себя до умопомрачения, пытаясь перевести и разобраться в японской версии? Которая, заметьте, совсем не по юриолю и потому для темы не канонична ^_^


Я за! Еще бы с объяснениями и вообще шикарно было бы :blush:
Спасибо сказали: DeadElf79

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Проект месяца 1 место Программист Ruby Писатель 3 место 3 место Учитель Организатор конкурсов 1 место в Готв Ветеран Проект месяца 2 место
Больше
10 года 3 мес. назад #89841 от DeadElf79
В таком случае заведу новую тему и по каждому из уроков буду писать код с комментариями)
Спасибо сказали: yuryol, DesKarD

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
10 года 1 мес. назад - 10 года 1 мес. назад #91223 от yuryol
Продублирую тут сообщения с нейтралки чтоб больше не спрашивали.

КАК сделать простенький стелс на MV

1)Создаешь четыре ветвления: если ЭТО событие смотрит вниз/ вверх/ влево/вправо

2) Внутри ветвления ВВЕРХ создаешь еще одно ветвление и пишешь там скрипт
Code:
($gamePlayer.y >= $gameMap.event(this._eventId).y)&&($gamePlayer.y<= $gameMap.event(this._eventId).y+5)&&($gamePlayer.x <= $gameMap.event(this._eventId).x+5)&&($gamePlayer.x >= $gameMap.event(this._eventId).x-5)
3)Внутри ветвления ВНИЗ создаешь еще одно ветвление и пишешь там скрипт
Code:
($gamePlayer.y <= $gameMap.event(this._eventId).y)&&($gamePlayer.y>= $gameMap.event(this._eventId).y-5)&&($gamePlayer.x <= $gameMap.event(this._eventId).x+5)&&($gamePlayer.x >= $gameMap.event(this._eventId).x-5)
4) Внутри ветвления ВЛЕВО создаешь еще одно ветвление и пишешь там скрипт
Code:
($gamePlayer.y >= $gameMap.event(this._eventId).y-5)&&($gamePlayer.y<= $gameMap.event(this._eventId).y+5)&&($gamePlayer.x <= $gameMap.event(this._eventId).x)&&($gamePlayer.x>= $gameMap.event(this._eventId).x-5)
5) Внутри ветвления ВЛЕВО создаешь еще одно ветвление и пишешь там скрипт
Code:
($gamePlayer.y >= $gameMap.event(this._eventId).y-5)&&($gamePlayer.y<= $gameMap.event(this._eventId).y+5)&&($gamePlayer.x >= $gameMap.event(this._eventId).x)&&($gamePlayer.x<= $gameMap.event(this._eventId).x+5)
6) Внутри этих четырех ветвлений создаешь нужные тебе эмоции/переключатели.

Получится что-то типа этого. Не забудьте поставить параллельный триггер. После каждой из эмоций ставим нужные переключатели



ИТОГО:
- Враг не видит персонажа у себя за спиной
- сбоку и впереди себя враг видит героя на расстоянии 4 клетки. На пятой клетке он его не видит. Если хочешь увеличить это расстояние, то меняешь каждую пятёрку в вышеприведенных скриптах на нужное число
- вместо цифр для расстояние видимости можно использовать значение переменной $gameVariables.value(n) где n номер переменной.
- переменные мы не затратили
- ветвлений 8 штук, не куча
Последнее редактирование: 10 года 1 мес. назад пользователем yuryol.
Спасибо сказали: RastaManGames, Jas6666, Rude, Noon

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Время создания страницы: 0.123 секунд
Работает на Kunena форум