Skip to content
This repository has been archived by the owner on Nov 15, 2022. It is now read-only.

Player Collision

Antek Bizon edited this page Mar 5, 2022 · 1 revision

Player::Collision

Reaguje odpowiednio na kolizję z danym obiektem. Aby sprawdzić kolizje z Blockiem i odpowiednio na nią zareagować, potrzebujemy sprawdzać kolizję w jednej płaszczyźnie przesunięcia. Dlatego sprawdzane jest, czy wystąpi kolizja z tym Blockiem, gdy przesuniemy Playera na poprzednią pozycję y. Jeśli wystąpi oznacza to, że kolizja zaszła z lewym lub prawym bokiem przeszkody. Jeśli natomiast nie wystąpi oznacza to, że kolizja nastąpiła z górną lub dolną ścianką. Wiedząc to teraz sprawdzamy prędkość z jaką Player się poruszał. Jeśli prędkość gracza w płaszczyźnie x była większa niż 0, oznacza to, że uderzyliśmy w prawą ściankę. Jeśli jest odwrotna sytuacja oznacza to, że w lewą. Analogicznie, gdy prędkość w płaszczyźnie y jest większa niż 0 oznacza to, że uderzyliśmy w górny bok, a jeśli mniejsze to w dolną.Dla kolizji z Enemy lub Crabem odejmowane jest życie, gracz jest podrzucany do góry, uruchamia się animacja zderzenia z przeciwnikiem, a także odgrywany jest dźwięk utraty życia. Kolizja z Ladderem pozwala graczowi wejść na nią. Sprawdzane jest czy znajduje się w strefach wejścia ustalonych i sprawdzane jest czy odpowiedni przeciska jest wciśnięty. W przypadku, kiedy już znajdujemy się na drabinie, funkcja sprawdza czy nie powinniśmy z niej zejść. Dla kolizją z ICE ustalana jest zmienna onIce na True.

void Player::Collision(Sprite *sprite) {
    if (sprite->type == Sprite::Type::BLOCK && !climbing) {
        collision = CheckCollisionRecs({ position.rectangle.x + position.hbRectangle.x, position.rectangle.y + position.hbRectangle.y - speed.y, position.hbRectangle.width, position.hbRectangle.height }, sprite->position.rectangle);
        if (collision) {
            if (speed.x > 0) 
                position.rectangle.x = sprite->position.rectangle.x - position.hbRectangle.width - position.hbRectangle.x;
            else if (speed.x < 0) 
                position.rectangle.x = sprite->position.rectangle.x + sprite->position.rectangle.width - position.hbRectangle.x;

            speed.x = 0;
        } else {
            if (speed.y > 0)
                position.rectangle.y = sprite->position.rectangle.y - position.rectangle.height;
            else if (speed.y < 0)
                position.rectangle.y = sprite->position.rectangle.y + sprite->position.rectangle.height;

            speed.y = 0;
        }
    } else if (sprite->type == Sprite::Type::ENEMY || sprite->type == Sprite::Type::CRAB) {
        game->lives--;
        frameCounter = 1;
        speed.y -= 10;
        PlaySound(game->audio[HEALTH_LOSE]);
    } else if (sprite->type == Sprite::Type::LADDER) {
        if (!climbing) {
            bool canClimbUp = position.rectangle.y < sprite->position.rectangle.y + sprite->position.rectangle.height && position.rectangle.y + position.rectangle.height > sprite->position.rectangle.y + sprite->position.rectangle.height;
            bool canClimbDown = position.rectangle.y < sprite->position.rectangle.y && position.rectangle.y + position.rectangle.height > sprite->position.rectangle.y;

            if (IsKeyDown(KEY_UP) && canClimbUp && !IsKeyDown(KEY_DOWN))
                climbing = true;
            else if (IsKeyDown(KEY_DOWN) && canClimbDown && !IsKeyDown(KEY_UP))
                climbing = true;

        } else {
            Ladder* ladder = static_cast<Ladder*>(sprite);
            position.rectangle.x = sprite->position.rectangle.x + (sprite->position.rectangle.width / 2) - (position.rectangle.width / 2);
            bool canStopClimbingUp = position.rectangle.y + position.rectangle.height < sprite->position.rectangle.y + 10;
            bool canStopClimbingDown = position.rectangle.y > sprite->position.rectangle.y + sprite->position.rectangle.height - ladder->distanceToGround;
            if (canStopClimbingDown || canStopClimbingUp)
                climbing = false;
        }
    } else if (sprite->type == Sprite::Type::ICE) {
        onIce = true;
    }
}
Clone this wiki locally