Обнаружение персонажа врагом

SFML и C++ Уроки \ Разработка игр Форумы Логика игр Обнаружение персонажа врагом

В этой теме 13 ответов, 5 участников, последнее обновление Yurec Yurec 2 года/лет, 11 мес. назад.

Просмотр 14 сообщений - с 1 по 14 (из 14 всего)
  • Автор
    Сообщения
  • #1301
    LastikPro
    LastikPro
    Участник
    Сообщений:93

    Зарегистрирован:
    09.07.2015

    Репутация:60

    Я хотел сделать обнаружение персонажа врагом но столкнулся с небольшой проблемой ,враг видит перса через стену. Как решить проблем я не знаю.

    Если что то не так или предложите систему по совершенней я готов переделать :).

    #1303
    Heisenberg
    Heisenberg
    Участник
    Сообщений:323

    Зарегистрирован:
    01.04.2015

    Репутация:145

    Ты научил врага глядеть на тебя, и понимать что это ты, научи его понимать что стена это стена) Если стена, то считать тебя в не зоны видимости.

    Поставь проверку на стену перед этим, и задавай соответствующий флаг, если стена то игнорируй действие обнаружения.
    так же проверкой пересечения только со стеной.

    #1305
    Павел Букреев
    Павел Букреев
    Хранитель
    Сообщений:586

    Зарегистрирован:
    04.01.2015

    Репутация:104

    сделать проверку что игрок и стена находятся в одном направлении. можно ведь проверять одновременно если игрок там и стена в этом же направлении, то не преследовать и не видеть игрока

    #1306
    LastikPro
    LastikPro
    Участник
    Сообщений:93

    Зарегистрирован:
    09.07.2015

    Репутация:60

    Фишка в том что нада убрать обнаружения только за стеной. Когда я чекаю наличие стены враг не реагирует на игрока вообще даже в упор:)

    #1307
    Павел Букреев
    Павел Букреев
    Хранитель
    Сообщений:586

    Зарегистрирован:
    04.01.2015

    Репутация:104

    чекнул стену – поставил переключатель на то, что есть стена. и в зависимости от этого переключателя враг должен реагировать на игрока или нет (т.е он начинает реагировать на него, если isWall==false, а иначе не реагирует)

    #1308
    Heisenberg
    Heisenberg
    Участник
    Сообщений:323

    Зарегистрирован:
    01.04.2015

    Репутация:145

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

    #1309
    LastikPro
    LastikPro
    Участник
    Сообщений:93

    Зарегистрирован:
    09.07.2015

    Репутация:60

    Но как чекнуть что сена перед игроком а не за?  За координатами игрока и стены ?

    #1311
    Heisenberg
    Heisenberg
    Участник
    Сообщений:323

    Зарегистрирован:
    01.04.2015

    Репутация:145
    #1314
    Павел Букреев
    Павел Букреев
    Хранитель
    Сообщений:586

    Зарегистрирован:
    04.01.2015

    Репутация:104

    Но как чекнуть что сена перед игроком а не за?  За координатами игрока и стены ?


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

    можно попробовать как сказал Heisenberg – расстояния.

    у тебя игрок &, стена |, враг E.

    предположим что наши символы и есть игрок стена враг и смоделируем такую ситуацию:
    & | E
    тогда имеем условие:
    если (у игрока по иксу правее есть стена) и (у врага по иксу левее есть стена) и (икс врага больше чем х игрока), то {враг не видит игрока;}
    разумеется это не единственное условие и не единственная ситуация. но можно попробовать по аналогии и со следующими.

    так же может быть случай, когда между на стене по горизонтали ними маленькая дырка,в которую они пролазят но стоят немного не ровно по отношению к ней и враг вобще должен увидеть игрока (но не увидит, т.к сработает наше условие выше). для этого надо дополнительно проверять разность координат по игреку. чтобы убрать вот такую погрешность в расчете.

    это все из головы. может там на деле нюансы всплывут какие.. а может и прокатит. попробуй )

     

     

    #1805
    Yurec
    Yurec
    Участник
    Сообщений:8

    Зарегистрирован:
    31.05.2015

    Репутация:2

    Реально в SFML сделать проверку не через  Rect, а через круг? к примеру стратегия где у юнита радиус поражения не прямоугольный, а круглый?

    #1806

    Oleg
    Участник
    Сообщений:11

    Зарегистрирован:
    09.08.2015

    Репутация:4

    Да. Но код проверки нужен свой, в стандартных функциях sfml не видел такого.

    #1818
    Yurec
    Yurec
    Участник
    Сообщений:8

    Зарегистрирован:
    31.05.2015

    Репутация:2

    К примеру в определенном радиусе проверять каждую клетку  на пересечение с прямоугольниками объектов из списка?

    #1819
    +1

    Oleg
    Участник
    Сообщений:11

    Зарегистрирован:
    09.08.2015

    Репутация:4

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

    #2162
    +1
    Yurec
    Yurec
    Участник
    Сообщений:8

    Зарегистрирован:
    31.05.2015

    Репутация:2

    я зделал через создание круглой формы, радиус которой равен радиусу поражения юнита, дальше
    CircleShape AttackRangeCircle;
    AttackRangeCircle.setRadius(attack_radius);

    установил этот круг в центр моего юнита в команде update(), теперь он будет двигаться с моим юнитом:
    AttackRangeCircle.setPosition(x – AttackRangeCircle.getRadius(), y – AttackRangeCircle.getRadius());//обновляем положение круга который является радиусом атаки обьекта

    и в игровом цикле установил проверку на пересечение с обьектами через функцию:
    if (Object1->AttackRangeCircle.getGlobalBounds().intersects(Object2->sprite.getGlobalBounds()))
    {
    return true;
    }
    когда спрайт объекта2 попадает на форму круга объекта1, функция возвращает true и первый обьект стреляет во второй.

Просмотр 14 сообщений - с 1 по 14 (из 14 всего)

Для ответа в этой теме необходимо авторизоваться.