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

CheckCollision

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

CheckCollision

Funkcja odpowiada za sprawdzenie czy wystąpiła kolizja między obiektami odpowiednich typów. Jest to zrobione za pomocą kilku pętli sprawdzających mapy konkretnych typów Spritów i wywołujących funkcję IsCollision dla par nich. W momencie otrzymania True (czyli wystąpienia kolizji) uruchamiane są odpowiednie funkcje dla tych obiektów.

void Game::CheckCollision() {
    // Collision Player<->Block
    for (auto& block : GetSprites(Sprite::Type::BLOCK)) {
        if (IsCollision(player, block)) {
            player->Collision(block);
        }
    }

    // Collision Player<->Enemy
    for (auto& enemy : GetSprites(Sprite::Type::ENEMY)) {
        if (IsCollision(player, enemy)) {
            if (!player->frameCounter)
                player->Collision(enemy);
        }
    }

    // Collision Player<->Ladder
    for (auto& ladder : GetSprites(Sprite::Type::LADDER)) {
        if (IsCollision(player, ladder)) {
            player->Collision(ladder);
        }
    }

    // Collision Player<->Powerup
    for (auto& powerup : GetSprites(Sprite::Type::POWERUP)) {
        if (IsCollision(player, powerup)) {
            player->Collision(powerup);
            powerup->Collision(player);
        }
    }

    // Collision Player<->Ice
    for (auto& ice : GetSprites(Sprite::Type::ICE)) {
        if (IsCollision(player, ice)) {
            player->Collision(ice);
        }
    }

    // Collision Player<->Crab
    for (auto& crab : GetSprites(Sprite::Type::CRAB)) {
        if (IsCollision(player, crab)) {
            if (!player->frameCounter)
                player->Collision(crab);
        }
    }

    // Collision Weapon<->Enemy
    for (auto& weapon : GetSprites(Sprite::Type::WEAPON)) {
        for (auto& enemy : GetSprites(Sprite::Type::ENEMY)) {
            if (IsCollision(weapon, enemy)) {
                std::cout << "WEAPON collided with ENEMY:" << std::endl;
                weapon->Collision(enemy);
                enemy->Collision(weapon);
                auto& v = spriteMap[Sprite::Type::ENEMY];
                size_t numEnemies = 0;
                for_each(v.begin(), v.end(), [&](Sprite* sprite) { if (sprite->type == Sprite::Type::ENEMY && sprite->state == Sprite::State::ACTIVE) numEnemies += 1; });
                if (numEnemies <= 0) {
                    ChangeState(State::LEVEL_FINISHED);
                }
            }
        }
    }

    // Collision Weapon<->Block
    for (auto& weapon : GetSprites(Sprite::Type::WEAPON)) {
        for (auto& block : GetSprites(Sprite::Type::BLOCK)) {
            if (IsCollision(weapon, block)) {
                block->Collision(weapon);
                weapon->Collision(block);
                break;
            }
        }
    }

    // Collision Weapon<->Crab
    for (auto& weapon : GetSprites(Sprite::Type::WEAPON)) {
        for (auto& crab : GetSprites(Sprite::Type::CRAB)) {
            if (IsCollision(weapon, crab)) {
                crab->Collision(weapon);
                weapon->Collision(crab);
                break;
            }
        }
    }

    // Collision Enemy<->Block
    for (auto& enemy : GetSprites(Sprite::Type::ENEMY)) {
        for (auto& block : GetSprites(Sprite::Type::BLOCK)) {
            if (IsCollision(enemy, block)) {
                enemy->Collision(block);
            }
        }
    }

    // Collision Powerup<->Block
    for (auto& powerup : GetSprites(Sprite::Type::POWERUP)) {
        for (auto& block : GetSprites(Sprite::Type::BLOCK)) {
            if (IsCollision(powerup, block)) {
                powerup->Collision(block);
            }
        }
    }

    // Collision Crab<->Block
    for (auto& crab : GetSprites(Sprite::Type::CRAB)) {
        for (auto& block : GetSprites(Sprite::Type::BLOCK)) {
            if (IsCollision(crab, block)) {
                crab->Collision(block);
            }
        }
    }
}
Clone this wiki locally