-
Notifications
You must be signed in to change notification settings - Fork 0
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;
}
}