Горизонтальное столкновение не работает AABB C ++ - PullRequest
0 голосов
/ 27 сентября 2018

Обновление

Снова изменили код столкновения и создали Компонент для AABB, теперь кажется, что проблема только в Горизонтальном столкновении, он не толкает объект, который он думаетно это тот же код, что и ось Y, поэтому это не должно быть проблемой.

(Он обнаруживает горизонтальное столкновение, разрешение проблемы)

image

void Hermes_Player::Collision(GameObject * other)
{
    if (other->GetTag() == "wall") {
        AABB* myAABB = dynamic_cast<AABB*>(this->GetComponent("aabb"));
        AABB* otherAABB = dynamic_cast<AABB*>(other->GetComponent("aabb"));
        if (abs(myAABB->lastCenter.x - otherAABB->lastCenter.x) < myAABB->halfCenter.x + otherAABB->halfCenter.x) {
            std::cout << "y" << std::endl;
            if (myAABB->center.y < otherAABB->center.y) {
                int distance = (myAABB->halfCenter.y + otherAABB->halfCenter.y) - (otherAABB->center.y - myAABB->center.y);
                this->Position.y -= distance;
                myAABB->center.y = (myAABB->center.y - distance);
            }
            if (myAABB->center.y > otherAABB->center.y) {
                int distance = (myAABB->halfCenter.y + otherAABB->halfCenter.y) - (myAABB->center.y - otherAABB->center.y);
                this->Position.y += distance;
                myAABB->center.y = (myAABB->center.y + distance);
            }
        }
        else
        {
            std::cout << "x" << std::endl;

            int dist = myAABB->halfCenter.x + otherAABB->halfCenter.x;
            int dif = (this->Size.x + other->Size.x) /2- abs(dist);
            if (myAABB->center.x < otherAABB->center.x) {
                int distance = (myAABB->halfCenter.x + otherAABB->halfCenter.x) - (otherAABB->center.x - myAABB->center.x);
                this->Position.x -= distance;
                myAABB->center.x = (myAABB->center.x - distance);
            }
            if (myAABB->center.x > otherAABB->center.x) {
                int distance = (myAABB->halfCenter.x + otherAABB->halfCenter.x) - (myAABB->center.x - otherAABB->center.x);
                this->Position.x += distance;
                myAABB->center.x = (myAABB->center.x + distance);
            }
            std::cout << this->Position.x << std::endl;
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Это может быть не то, что вы ищете, но попытка разрешить оси X и Y одновременно может быть довольно сложной.отдельно.

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

Эта статья помогла мне, когда я разрабатывал свой собственный 2D-платформер, и рекомендует эту практику:

http://higherorderfun.com/blog/2012/05/20/the-guide-to-implementing-2d-platformers/

0 голосов
/ 27 сентября 2018

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

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

Или может случиться так, что вы столкнетесь с двумя объектами, если разрешить второй, вы вернетесь к тому, из которого вы уже настроены.

По крайней мере,после корректировки положения необходимо проверить, все ли чисто, для всех объектов.

...