Войти на сайт

Авторизация, ждите ...
×
  • Страница:
  • 1
  • 2

ТЕМА: Зрение монстра на эвентах.

Зрение монстра на эвентах. 8 года 9 мес. назад #89689

  • Демий
  • Демий аватар
  • Вне сайта
  • Модератор
  • Здесь могла быть ваша реклама
  • Сообщений: 1597
  • Спасибо получено: 1520
  • 3 место3 место ГотвРазработчик1 место в ГотвУчительТестерВетеранПисатель 2 место
yuryol пишет:
На основе чего можно делать проверку проходимости событий?
$game_map.check_passage(x, y, 0xF) == true

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

Зрение монстра на эвентах. 8 года 9 мес. назад #89690

  • Cerberus
  • Cerberus аватар
  • Вне сайта
  • Модератор
  • Собака злая
  • Сообщений: 2269
  • Спасибо получено: 1182
  • 3 место ГотвОрганизатор конкурсовПроект месяца 2 местоПобедитель Сбитой кодировкиПрограммист JavaScript Писатель 3 место2 место Сбитая кодировка2 место Проект месяца 3 место3 место
Демий, check_passage как раз на события плюёт. Она проверяет только тайлы.
Жуть болотная, на лапках, в тапках и с пулемётом...
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: yuryol

Зрение монстра на эвентах. 8 года 9 мес. назад #89692

  • Демий
  • Демий аватар
  • Вне сайта
  • Модератор
  • Здесь могла быть ваша реклама
  • Сообщений: 1597
  • Спасибо получено: 1520
  • 3 место3 место ГотвРазработчик1 место в ГотвУчительТестерВетеранПисатель 2 место
Cerberus пишет:
Демий, check_passage как раз на события плюёт. Она проверяет только тайлы.

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

Зрение монстра на эвентах. 8 года 9 мес. назад #89736

  • yuryol
  • yuryol аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1704
  • Спасибо получено: 2731
  • УчительОратор3 место ГотвПобедитель конкурсаКомпозитор2 место Организатор конкурсов1 место в Готв
Продолжаем мучаться со стелсом.
Сначала хотя бы просто попробуем сделать игрока невидимым,если стена находится ниже игрока и выше врага. Как на этом скрине. Красный - местоположения игрока. Коричневые - стены.

2016-02-0323-43-51MicrosoftExcel-.xlsx.png


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

2016-02-0323-54-06.png


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

2016-02-0400-10-15-ID001.png



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 шаге.
То есть программа будет считать до тех пор пока не найдет непроходимый тайл или не ограичется дальностью зрения врага.
Получается такая штука

2016-02-0400-42-41-ID001.png


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

2016-02-0400-47-40MicrosoftExcel-.xlsx.png


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

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
В итоге у нас получается вот такое событие

2016-02-0401-10-05-ID001.png


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

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


2016-02-0401-11-49MicrosoftExcel-.xlsx.png



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

Зрение монстра на эвентах. 8 года 9 мес. назад #89823

  • yuryol
  • yuryol аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1704
  • Спасибо получено: 2731
  • УчительОратор3 место ГотвПобедитель конкурсаКомпозитор2 место Организатор конкурсов1 место в Готв
dqZ0dYw.png

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

2016-02-0714-41-50SAI-EdqZ0dYw.png.png


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

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

Зрение монстра на эвентах. 8 года 9 мес. назад #89825

  • DesKarD
  • DesKarD аватар
  • Вне сайта
  • Заблокирован
  • Очередной шутнечок...
  • Сообщений: 300
  • Спасибо получено: 191
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
Золотой сборник цитат Светлой [ Нажмите, чтобы развернуть ]

Помогите Юриолю потушить его попчанский [ Нажмите, чтобы развернуть ]
Последнее редактирование: 8 года 9 мес. назад от DesKarD.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: yuryol

Зрение монстра на эвентах. 8 года 9 мес. назад #89831

  • Cerberus
  • Cerberus аватар
  • Вне сайта
  • Модератор
  • Собака злая
  • Сообщений: 2269
  • Спасибо получено: 1182
  • 3 место ГотвОрганизатор конкурсовПроект месяца 2 местоПобедитель Сбитой кодировкиПрограммист JavaScript Писатель 3 место2 место Сбитая кодировка2 место Проект месяца 3 место3 место
Ветвление условий в DO (это не синтаксис Руби, ну да ладно) означает "если предыдущее условие верно - проверить это". Ветвление условий в ELSEIF означает "если предыдущее условие неверно - проверить это". Что из этого выбирать - по такому куску кода понять сложно.
Жуть болотная, на лапках, в тапках и с пулемётом...
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: DesKarD

Зрение монстра на эвентах. 8 года 9 мес. назад #89839

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • Организатор конкурсовПрограммист RubyПроект месяца 2 местоПисатель 3 место1 место в Готв3 местоПроект месяца 1 местоВетеранУчитель
Написать ли свой скрипт на основе уроков от юриоля? Или подождать, пока дескард доведет себя до умопомрачения, пытаясь перевести и разобраться в японской версии? Которая, заметьте, совсем не по юриолю и потому для темы не канонична ^_^
Администратор запретил публиковать записи гостям.

Зрение монстра на эвентах. 8 года 9 мес. назад #89840

  • yuryol
  • yuryol аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1704
  • Спасибо получено: 2731
  • УчительОратор3 место ГотвПобедитель конкурсаКомпозитор2 место Организатор конкурсов1 место в Готв
DeadElf79 пишет:
Написать ли свой скрипт на основе уроков от юриоля? Или подождать, пока дескард доведет себя до умопомрачения, пытаясь перевести и разобраться в японской версии? Которая, заметьте, совсем не по юриолю и потому для темы не канонична ^_^

Я за! Еще бы с объяснениями и вообще шикарно было бы :blush:
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: DeadElf79

Зрение монстра на эвентах. 8 года 9 мес. назад #89841

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • Организатор конкурсовПрограммист RubyПроект месяца 2 местоПисатель 3 место1 место в Готв3 местоПроект месяца 1 местоВетеранУчитель
В таком случае заведу новую тему и по каждому из уроков буду писать код с комментариями)
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: yuryol, DesKarD

Зрение монстра на эвентах. 8 года 7 мес. назад #91223

  • yuryol
  • yuryol аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1704
  • Спасибо получено: 2731
  • УчительОратор3 место ГотвПобедитель конкурсаКомпозитор2 место Организатор конкурсов1 место в Готв
Продублирую тут сообщения с нейтралки чтоб больше не спрашивали.

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

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

2) Внутри ветвления ВВЕРХ создаешь еще одно ветвление и пишешь там скрипт
($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)Внутри ветвления ВНИЗ создаешь еще одно ветвление и пишешь там скрипт
($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) Внутри ветвления ВЛЕВО создаешь еще одно ветвление и пишешь там скрипт
($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) Внутри ветвления ВЛЕВО создаешь еще одно ветвление и пишешь там скрипт
($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 штук, не куча
Последнее редактирование: 8 года 7 мес. назад от yuryol.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: RastaManGames, Jas6666, Rude, Noon
  • Страница:
  • 1
  • 2
Время создания страницы: 0.358 секунд