Zaimplementowano pauze

This commit is contained in:
2025-01-09 12:11:56 +01:00
parent 5ad7cc9d1e
commit 62808a9fbf
3 changed files with 120 additions and 89 deletions

View File

@@ -36,8 +36,15 @@ public:
void update_meteors();
void update_hearts();
void update_power_ups();
void update();
void update_score();
void check_PowerUp_collisions();
void check_Heart_collisions();
void check_Meteor_collisions();
void spawn_player();
void spawn_enemy();
void spawn_advanced_enemy();
@@ -50,13 +57,13 @@ public:
static ships selectedShip;
static unsigned int score;
sf::Font font;
private:
Background background;
AudioManager audioManager;
Player *ship;
Size size;
sf::RenderWindow *window;
sf::Font font;
sf::Clock meteorSpawnClock;
sf::Clock heartSpawnClock;
sf::Clock powerUpSpawnClock;

View File

@@ -19,6 +19,7 @@ int main() {
icon.loadFromFile("../assets/img/icon/ikonka.png");
mainWindow.setIcon(128, 128, icon.getPixelsPtr());
bool isPaused = false;
Plansza plansza(mainWindow.getSize().y, mainWindow.getSize().x, &mainWindow, selectedShip);
@@ -32,11 +33,29 @@ int main() {
mainWindow.close();
}
plansza.update();
// Obsługa pauzy
if (event.key.code == sf::Keyboard::P) {
isPaused = !isPaused;
sf::RectangleShape bg(sf::Vector2f(mainWindow.getSize().x, mainWindow.getSize().y));
bg.setFillColor(sf::Color(0,0,0,100));
sf::Text text("PAUZA", plansza.font, 50);
text.setOrigin(text.getLocalBounds().getSize().x/2, text.getLocalBounds().getSize().y/2);
text.setFillColor(sf::Color::White);
text.setPosition(mainWindow.getSize().x/2, mainWindow.getSize().y/2);
plansza.update();
mainWindow.draw(bg);
mainWindow.draw(text);
mainWindow.display();
}
if (!isPaused) { // jesli nie spauzowane to graj
plansza.update();
mainWindow.display();
}
}
return 0;
}
@@ -121,6 +140,9 @@ void menu() {
menuWindow.close();
exit(-2);
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Enter)) {
menuWindow.close();
}
if (event.type == sf::Event::MouseButtonPressed) {
if (event.mouseButton.button == sf::Mouse::Left) {

View File

@@ -72,7 +72,7 @@ Plansza::Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::Render
// TODO: Refactor tej metody bo rozrosła się za bardzo już
void Plansza::update() {
srand(time(0));
srand(time(0)); // generacja innego ziarna na podstawie zegara systemowego
// tło
background.update();
background.draw(*window);
@@ -109,18 +109,17 @@ void Plansza::update() {
// audioManager.playSoundEffect("shoot_alt", 70.f); // Odtworzenie dźwięku dla alternatywnego strzału
}
// generowanie nowego meteoru
ship->update(); // migotanie statku
update_score(); // naliczanie punktów
// Sprawnowanie wszystkich rodzajów wrogów
// spawn_meteor();
// spawn_hearts();
spawn_meteor();
spawn_hearts();
spawn_power_up();
// spawn_enemy();
// spawn_advanced_enemy();
// spawn_wiazkowiec();
// spawn_bomber();
// spawn_kamikadze();
spawn_enemy();
spawn_advanced_enemy();
spawn_wiazkowiec();
spawn_bomber();
spawn_kamikadze();
// utrzymanie meteorów i pocisków w ruchu
for (auto &meteor: meteors) {
@@ -156,44 +155,9 @@ void Plansza::update() {
window->draw(ship->getSprite());
for (auto &meteor: meteors) {
if (ship->getSprite().getGlobalBounds().intersects(meteor.getSprite().getGlobalBounds())) {
ship->takeDamage();
}
}
for (auto heartIt = hearts.begin(); heartIt != hearts.end();) {
if (ship->getSprite().getGlobalBounds().intersects(heartIt->getSprite().getGlobalBounds())) {
ship->healUP();
heartIt = hearts.erase(heartIt);
} else {
++heartIt;
}
}
// TODO: Dodać obsługę kilku różnych power-upów
////////////////////////////////////////////////////////////////////////////////////////////////
// Sprawdzenie kolizji z power-upem na prędkość poruszania się i zwiększenie prędkości statku
for (auto powerUpIt = powerUps.begin(); powerUpIt != powerUps.end();) {
if (ship->getSprite().getGlobalBounds().intersects(powerUpIt->getSprite().getGlobalBounds())) {
if (powerUpIt->getType() == PowerUp::movingSpeedUp) {
ship->setMovingSpeed(15.0f);
movingSpeedPUTimer.restart();
}
if (powerUpIt->getType() == PowerUp::firerateUp) {
ship->setFirerate(100);
fireratePUTimer.restart();
}
if (powerUpIt->getType() == PowerUp::tripleShotUp) {
ship->setTripleShot(true);
tripleShotPUTimer.restart();
}
powerUpIt = powerUps.erase(powerUpIt);
} else {
++powerUpIt;
}
}
check_Meteor_collisions();
check_Heart_collisions();
check_PowerUp_collisions();
if (movingSpeedPUTimer.getElapsedTime().asSeconds() >= 5.0f) {
ship->setMovingSpeed(8.0f);
@@ -204,43 +168,6 @@ void Plansza::update() {
if (tripleShotPUTimer.getElapsedTime().asSeconds() >= 5.0f) {
ship->setTripleShot(false);
}
///////////////////////////////Koniec obsługi kolizji z power-upami//////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
for (auto meteorIt = getMeteors().begin(); meteorIt != getMeteors().end();) {
bool meteorHit = false;
for (auto rocketIt = ship->getBullets().begin(); rocketIt != ship->getBullets().end();) {
if (meteorIt->getSprite().getGlobalBounds().intersects(rocketIt->getSprite().getGlobalBounds())) {
ship->getBullets().erase(rocketIt);
meteorIt = getMeteors().erase(meteorIt);
meteorHit = true;
break;
} else {
++rocketIt;
}
}
if (!meteorHit) {
++meteorIt;
}
}
for (auto meteorIt = getMeteors().begin(); meteorIt != getMeteors().end();) {
bool meteorHit = false;
for (auto rocketIt = ship->getRockets().begin(); rocketIt != ship->getRockets().end();) {
if (meteorIt->getSprite().getGlobalBounds().intersects(rocketIt->getSprite().getGlobalBounds())) {
ship->getRockets().erase(rocketIt);
meteorIt = getMeteors().erase(meteorIt);
meteorHit = true;
break;
} else {
++rocketIt;
}
}
if (!meteorHit) {
++meteorIt;
}
}
if (gameOver) {
sf::RenderWindow errorWindow(sf::VideoMode(350, 200), "The end");
@@ -305,6 +232,40 @@ void Plansza::update() {
}
}
for (auto meteorIt = getMeteors().begin(); meteorIt != getMeteors().end();) {
bool meteorHit = false;
for (auto bulletIt = ship->getBullets().begin(); bulletIt != ship->getBullets().end();) {
if (meteorIt->getSprite().getGlobalBounds().intersects(bulletIt->getSprite().getGlobalBounds())) {
ship->getBullets().erase(bulletIt);
meteorIt = getMeteors().erase(meteorIt);
meteorHit = true;
break;
} else {
++bulletIt;
}
}
if (!meteorHit) {
++meteorIt;
}
}
for (auto meteorIt = getMeteors().begin(); meteorIt != getMeteors().end();) {
bool meteorHit = false;
for (auto rocketIt = ship->getRockets().begin(); rocketIt != ship->getRockets().end();) {
if (meteorIt->getSprite().getGlobalBounds().intersects(rocketIt->getSprite().getGlobalBounds())) {
ship->getRockets().erase(rocketIt);
meteorIt = getMeteors().erase(meteorIt);
meteorHit = true;
break;
} else {
++rocketIt;
}
}
if (!meteorHit) {
++meteorIt;
}
}
// Ruch i render przeciwnika
for (auto it = enemies.begin(); it != enemies.end();) {
it->update(); // Aktualizacja kierunku i ruchu
@@ -769,8 +730,8 @@ void Plansza::update_power_ups() {
}
void Plansza::spawn_meteor() {
if (meteorSpawnClock.getElapsedTime().asSeconds() > rand() % 10 + 1) { // randomowy spawn meteorytów od 10 do 1 sekundy
if (meteors.size() < 5) { // jeśli jest mniej niż 5 meteorów na planszy
if (meteorSpawnClock.getElapsedTime().asSeconds() > rand() % 30 + 5) { // randomowy spawn meteorytów od 10 do 1 sekundy
if (meteors.size() < 3) { // jeśli jest mniej niż 5 meteorów na planszy
if (rand() % 2 == 1) {
meteors.emplace_back(RandomNumberGenerator::getRandomNumber(50, 499), -100, meteorTexture2);
} else {
@@ -890,5 +851,46 @@ void Plansza::update_score() {
window->draw(text);
}
void Plansza::check_PowerUp_collisions() {
for (auto powerUpIt = powerUps.begin(); powerUpIt != powerUps.end();) {
if (ship->getSprite().getGlobalBounds().intersects(powerUpIt->getSprite().getGlobalBounds())) {
if (powerUpIt->getType() == PowerUp::movingSpeedUp) {
ship->setMovingSpeed(15.0f);
movingSpeedPUTimer.restart();
}
if (powerUpIt->getType() == PowerUp::firerateUp) {
ship->setFirerate(100);
fireratePUTimer.restart();
}
if (powerUpIt->getType() == PowerUp::tripleShotUp) {
ship->setTripleShot(true);
tripleShotPUTimer.restart();
}
powerUpIt = powerUps.erase(powerUpIt);
} else {
++powerUpIt;
}
}
}
void Plansza::check_Heart_collisions() {
for (auto heartIt = hearts.begin(); heartIt != hearts.end();) {
if (ship->getSprite().getGlobalBounds().intersects(heartIt->getSprite().getGlobalBounds())) {
ship->healUP();
heartIt = hearts.erase(heartIt);
} else {
++heartIt;
}
}
}
void Plansza::check_Meteor_collisions() {
for (auto &meteor: meteors) {
if (ship->getSprite().getGlobalBounds().intersects(meteor.getSprite().getGlobalBounds())) {
ship->takeDamage();
}
}
}
ships Plansza::selectedShip = none;
unsigned int Plansza::score = 0;