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