SFML и C++ Уроки \ Разработка игр › Форумы › Логика игр › Создание функции столкновения любого объекта с любым
В этой теме 2 ответа, 2 участника, последнее обновление BunDem 3 года/лет, 11 мес. назад.
-
АвторСообщения
-
Есть множество классов и объектов из них. Прописывать логику столкновения каждого с каждым очень громоздко, не практично и уверен, что неправильно. Работаю на VS2017 + SFML.
Дайте пожалуйста наводки, каким способом это реализовать одним решением. Задача – сделать функцию, которая будет логикой столкновений для любого объекта при взаимодействии с любым.Наивно мечтаю, что есть какой-то метод, подобный такому:
C++1AnyClass::AnyObject.GetGlobalBounds().intersects(AnyClass::AnyObject.GetGlobalBounds());Судя по активности в данной теме чувствую, что здесь буду писать ответы самому себе.
Ответ ниже. Но появился новый вопрос нереальной для меня (сейчас) сложности.
Надеюсь на тебя, будущий я)C++12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455class Personage :public FisObj {///....////Personage(int P, float X, float Y) {///....////}void GoPers(float &time, Vector2f &pos, float SPEEDX, float SPEEDY) {if (Go){////Реализовал передвижение по заданному отрезку из урока 18//////tempX = pos.x; tempY = pos.y;speedX = SPEEDX; speedY = SPEEDY;dX = tempX - x;dY = tempY - y;distance = sqrt(dX * dX + dY * dY);if (distance > 2){x += (speedX * time * dX / distance);y += (speedY * time * dY / distance);}else Go = false;sprt.setPosition(x, y);}}int main() {list<Personage*> Pers;list<Personage*>::iterator itPers;vector<Lets*> let; //Класс Lets хранит Прямоугольники коллизий на карте.vector<Lets*>::iterator itlet;let.push_back(&B1);let.push_back(&BMain);let.push_back(&B2);let.push_back(&Water);while (window.isOpen()) {//......//for (itPers = Pers.begin(); itPers != Pers.end(); itPers++) {for (itlet = let.begin(); itlet != let.end(); itlet++) {if ((*itPers)->sprt.getGlobalBounds().intersects((*itlet)->Zone.getGlobalBounds())) {if ((int)(*itlet)->UpGrn == (int)(*itPers)->UpGrn ||(int)(*itlet)->UpGrn == (int)(*itPers)->LeftGrn ||(int)(*itlet)->UpGrn == (int)(*itPers)->RightGrn)//////////Если Верхняя грань коллизии пересекается с какой-либо из граней игрока////{cout << "Up" << endl;//В консоль он сообщает, что препятствие именно сверху. Ниже аналогичные условия для "Down","Left","Right"/////////////////////////////////////////////////////////////////////////////////////////////////Сама соль в том, как реализовать отключение скорости по оси, на которой стоит коллизия,//////в данном случае Y, но сделать это так, чтобы эта скорость включалась именно при отсутствии//////пересечения конкретно данного объекта с данной коллизией. И я устал ломать голову над этим////}}}Да, активность такая, жди ответа пол года, ахахаха. (Если повезет). Твои наивные мечты не наивны. Есть такое понятие как Полиморфизм. Ты создаёшь отдельный класс Solid (т.е. твёрдый) и от этого класса наследуешь все классы, которые должны сталкиваться. В Solid хранишь данные о FloatRect (позиция, ширина, высота) и функция проверки столкновений bool intersects(Solid otherSolid) {
this.GetGlobalBounds.intersects(otherSolid.getRect());}
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.