SFML и C++ Уроки \ Разработка игр › Форумы › Логика игр › Взаимодействие объектов
В этой теме 15 ответов, 6 участников, последнее обновление RazorNd 8 года/лет, 1 месяц назад.
-
АвторСообщения
-
Имеется много динамических объектов (мобов, противников ). Грузятся они массивом но можно и по одному. Представляют из себя класс со своими методами, научены пока что следовать за игроком если он в поле их видимости и не следовать если не в поле. Поле видимости определяться расстоянием вектора до игрока, то есть – каждый моб вычисляет расстояние до игрока и определяет равно ли оно радиусу его видимости или нет. Все хорошо работает но то того момента когда мобов больше чем один.
Попытка сделать все универсально по ходу процесса все больше и больше терпит не удачу ( . Проблема возникает в момент следование мобов за игроком а именно – они начинают сливаться друг в друга(нет функции обработки столкновений между мобами)
Функцию сделать не так сложно как заставить моба определять остальных мобов возле себя, как близко они к нему и что вообще происходит возле него чтобы запустить процесс отталкивание его от других. Рисовать вектор от одного моба к другим мобам и определять сторону к которой он подходит ? а если их 50 ? или заранее не известно их количество ? По моему субъективному мнению это не тот вариант который подходит(пробовал рисовать в ручную хотя бы 10 мобов и вектор от одного к остальным , в и тоге получил паутину да и это слишком ресурс-о емко.
Может кто знает вариант как такое можно провернуть ?
Даже выше описанное не предоставляет такой проблемы как заставить моба определить существование остальных как таковых вообще. Не охота передавать в метод апдейт каждый экземпляр класса (если их 10 то каждому я должен передать силку на 9 остальных чтоб он хотя бы знал об их существовании).
Вложения:
You must be logged in to view attached files.Игра класс!
а если добавить в действие каждого скелета пару раз рандома? тогда они будут более хаотично разбросаны по карте. ну или можно сделать столкновения между ними с помощью intersect
В принципе я сделал функцию, она работает.
Передал в класс силку на массив, внутри класса функция которая проходит по циклу минуя индекс самого себя (чтоб не проверять столкновение с самим собой ). Но пока проблемы с отталкиванием (.
решил проблемы с отталкиванием?
Не. Их то телепортирует то просто не чего происходит. Пример перемещения брал у тебя из урока о создании врага. Двигаю их не setPosition(); а move, все работает отлично. Решил взять это за вектор скорости :
x += 0.1*timee*(xT – xM) / TargetDistance;
y += 0.1*timee*(yT – yM) / TargetDistance;Потом move(x,y);
Возникла идея по типу как тут :http://monkey-x.ru/knowledge/articles/12-fizicheskie-dvizhki-dlya-chainikov
но пока что знаний у меня для этого не хватает.
Чувствую что придется учить матрицы итд….(
они друг друга отталкивают просто? а если скорость у одного из них занулить в этот момент?
Если их останавливать то я думаю они будут ходить рывками. Но я попробую
Не понимаю, зачем делать векторы между скелетами, если можно просто проверять на пересечение спрайтов. Если они столкнуться, то просто скорость сбивай, а в новом проходе цикла опять скорость выстави. В итоге они соберутся строем и будут дружно идти
Не все так просто
разобрался? попробуй сделай выталкивание для каждого из них.
типа так:
C++1234567891011121314151617if ((*it2)->Name=="Enemy")if ((*it)->getRect()!=(*it2)->getRect())if ((*it)->getRect().intersects((*it2)->getRect())){if (((*it)->dy)>0){ (*it)->y = ((*it2)->y)-((*it2)->h);}if ((*it)->dy<0){ (*it)->y = (*it2)->y+(*it2)->h;}if ((*it)->dx>0){ (*it)->x = (*it2)->x-(*it2)->w; }if ((*it)->dx<0){ (*it)->x = (*it2)->x+(*it2)->w; }}}чтобы обойти своего можно попробовать сделать ф-цию которая принимает объект этого класса (или список таких объектов) и делать проверку что то типа наперед:
1враг(стоит) 2враг (идёт влево , пока не случится “коллизия с врагом слева”, как только тру , то идёт вниз)
ситуация наоборот:
1враг(идёт вправо, пока с ним не случится “коллизия с врагом справа”) 2враг (стоит )
ну или без этой ф-ции просто итераторы как в уроке (взаимодействие объектов списка между собой) один объект с другими сравнивать и после коллизии делать какие то действия.
Не) тут сложнее всё. В общем судя по всему придётся использовать волновой алгоритм поиска пути А* a-star.
Пока что ещё не знаю как его делать. Но будем посмотреть))
)))Визуального представления полно в инете. И между прочим на картинке что ты скинул не очень хороший поиск пути.
Вот ежели бы ты код скинул. Рабочий для SFML и С++ тогда другое дело.
Я так понимаю что с поиском пути как таковым никто не сталкивался. Потому как никто не выложил рабочий код.
Тогда предлагаю вот что. Общими усилиями создать такой код для SFML.
Описание: Википедия Алгоритм ЛИ
Хотелось бы для начала осилить хотябы ортогональный поиск пути. То есть “в окрестности фон Неймана соседними ячейками считаются только 4 ячейки по вертикали и горизонтали”
Во вложении Слева поиск пути A* а справа Волновой алгоритм.
Вложения:
You must be logged in to view attached files. -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.