SFML и C++ Уроки \ Разработка игр › Форумы › SFML готовые решения (сниппеты) и советы › Обнаружение игрока врагом
В этой теме 3 ответа, 2 участника, последнее обновление Павел Букреев 8 года/лет, 8 мес. назад.
-
АвторСообщения
-
Ниже я приведу пример из своей игры (карта в игре tmx но код можно переделать под масив).
Для начала ,если вы не хотите чтобы поле зрения врага было 360 градусов , нужно сделать вектор взгляда врага.
C++123FloatRect getEnemyview(){//ф-ция получения поля зрения врага.return FloatRect(x , y, w+vec, h);// vec вектор взгляда врага}Поскольку я делал платформер, то у меня два направления: влево и вправо.Я добавил перечисляемые тип EnemyState отвечающий за это.
C++1enum { left, right,stay } EnemyState;В столкновении врага с картой добавил:
C++123456if (obj[i].name == "solid"){if (Dx > 0){ x = obj[i].rect.left - w; dx = -0.045; EnemyState = left; }//если столкнулся с правой стенкой враг будет смотреть влево.if (Dx < 0) { x = obj[i].rect.left + obj[i].rect.width; dx = 0.045; EnemyState = right; }// если с левой стенкой то смотрит вправо.}В update врага:
C++12345switch (EnemyState){case right:vec = 300; break;// 300 дальность взгляда врага.case left:vec =- 300; break;}Осталось проверить пересечение игрока и взгляда врага:
C++123456789101112for (it = entities.begin(); it != entities.end(); it++){Entity *t = *it;if ((*it)->getEnemyview().intersects(p.getRect()))// проверка напересечение{if (t->name == "CheliEnemy"){t->EnemyState = t->stay;// если враг заметил он останавливаеться}}}Теперь враг замечает игрока только если повёрнут к нему лицом если убрать вектор то он будет замечать игрока затылком. Но есть небольшая проблем враг игнорирует стенки . Чтобы это исправить нужно добавить слепые зоны для врага. То есть если игрок в слепой зоне то он невидим для врага. Для этого на карте нужно добавить объекты (я назвал их blindspot) а в взаимодействие игрока с картой нужно добавить :
C++123456if (obj[i].name == "blindspot")// если игрок и слепая зона пересеклись.{onblindspot = true;// то игрок в слепой зоне.}elseonblindspot = false;// если не пересеклись то игрок видим для врага.Осталось добавить в взгляде врага проверку на слепые зоны:
C++12345if (t->name == "CheliEnemy"){if (onblindspot==false)t->EnemyState = t->stay;}Удачи в ваших проектах!
молодец) так и надо – делиться опытом:)
обсуждали тему в другой ветке – у меня была мысль предложить тебе сделать такие точки, но если можно обойтись без них, то надо стараться обойтись. ведь таким образом мы тянем еще один объект в карте, плюс его так же надо сопровождать и ставить рядом с врагами. может потом удастся сделать взаимодействие врага через объект solid (простая стена), тогда разработчику не придется думать о слепых зонах и добавлять их в игру.
но ведь работает немного похоже на дз к одному из уроков – там надо было реализовать видимость игрока врагом и преследование:) так держать , лови плюс:)Но такой вариант в 100500 раз легче чем проверять расстояние между игроком, стеной, и врагом.
Это да. всё же я думаю когда нибудь запилим по всякому
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.