Dziala powerup na prędkość poruszania się

This commit is contained in:
2025-01-06 01:31:59 +01:00
parent 3d83a3a767
commit b1b5858fb6
10 changed files with 85 additions and 28 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

@@ -6,7 +6,7 @@
class Heart : public ObjectItem { class Heart : public ObjectItem {
public: public:
Heart(float x, float y, sf::Texture &texture); Heart(float x, float y, sf::Texture &texture_);
void update() override; void update() override;
}; };

View File

@@ -7,6 +7,7 @@
class ObjectItem { class ObjectItem {
public: public:
virtual ~ObjectItem() = default;
ObjectItem(float x, float y, sf::Texture &texture); ObjectItem(float x, float y, sf::Texture &texture);
sf::Sprite &getSprite(); sf::Sprite &getSprite();
bool getStatus(); bool getStatus();

View File

@@ -15,6 +15,7 @@
#include "AudioManager.h" #include "AudioManager.h"
#include "Plansza.h" #include "Plansza.h"
#include "Heart.hpp" #include "Heart.hpp"
#include "PowerUp.h"
#include "Size.h" #include "Size.h"
enum ships{ enum ships{
@@ -31,8 +32,10 @@ public:
std::vector<Meteor> &getMeteors(); std::vector<Meteor> &getMeteors();
void spawn_meteor(); void spawn_meteor();
void spawn_hearts(); void spawn_hearts();
void spawn_power_up();
void update_meteors(); void update_meteors();
void update_hearts(); void update_hearts();
void update_power_ups();
void update(); void update();
void update_score(); void update_score();
void spawn_player(); void spawn_player();
@@ -56,6 +59,7 @@ private:
sf::Font font; sf::Font font;
sf::Clock meteorSpawnClock; sf::Clock meteorSpawnClock;
sf::Clock heartSpawnClock; sf::Clock heartSpawnClock;
sf::Clock powerUpSpawnClock;
sf::Clock spawnClock; sf::Clock spawnClock;
sf::Clock scoreClock; sf::Clock scoreClock;
sf::Clock shooterSpawnClock; sf::Clock shooterSpawnClock;
@@ -79,6 +83,7 @@ private:
sf::Texture meteorTexture2; sf::Texture meteorTexture2;
sf::Texture heartTexture; sf::Texture heartTexture;
sf::Texture heartTextureGray; sf::Texture heartTextureGray;
sf::Texture powerUpTexture;
std::vector<Enemy> enemies; std::vector<Enemy> enemies;
std::vector<AdvancedEnemy> AEnemies; std::vector<AdvancedEnemy> AEnemies;
std::vector<Bomber> BEnemies; std::vector<Bomber> BEnemies;
@@ -87,6 +92,7 @@ private:
std::vector<Meteor> meteors; std::vector<Meteor> meteors;
std::vector<Heart> hearts; std::vector<Heart> hearts;
std::vector<sf::Sprite> heartStats; std::vector<sf::Sprite> heartStats;
std::vector<PowerUp> powerUps;
bool gameOver = false; bool gameOver = false;
}; };

View File

@@ -2,8 +2,10 @@
#define POWERUP_H #define POWERUP_H
#include "ObjectItem.hpp" #include "ObjectItem.hpp"
class PowerUp : ObjectItem { class PowerUp : public ObjectItem {
public:
PowerUp(float x, float y, sf::Texture &texture_);
void update() override;
}; };
#endif //POWERUP_H #endif //POWERUP_H

View File

@@ -1,13 +1,11 @@
#include "../headers/Heart.hpp" #include "../headers/Heart.hpp"
Heart::Heart(float x, float y, sf::Texture &texture) : ObjectItem(x,y,texture) { Heart::Heart(float x, float y, sf::Texture &texture) : ObjectItem(x,y,texture) {
outOfBounds = false; texture_ = texture;
texture = texture; sprite.setTexture(texture_);
sprite.setTexture(texture);
sprite.setOrigin(sprite.getLocalBounds().width / 2, sprite.getLocalBounds().height / 2); // wycentrowanie sprite sprite.setOrigin(sprite.getLocalBounds().width / 2, sprite.getLocalBounds().height / 2); // wycentrowanie sprite
sprite.setPosition(x, y); sprite.setPosition(x, y);
movingSpeed = 3.0f; movingSpeed = 3.0f;
// sprite.scale(0.05f, 0.05f);
position.x = x; position.x = x;
position.y = y; position.y = y;
rotationSpeed = 0; rotationSpeed = 0;
@@ -16,7 +14,6 @@ Heart::Heart(float x, float y, sf::Texture &texture) : ObjectItem(x,y,texture) {
void Heart::update() { void Heart::update() {
sprite.move(0.0f, movingSpeed); // przesunięcie sprajta sprite.move(0.0f, movingSpeed); // przesunięcie sprajta
position.y += int(movingSpeed); // przesunięcie pozycji position.y += int(movingSpeed); // przesunięcie pozycji
// sprite.rotate(rotationSpeed); // obracanie tym meteorkiem pięknym
if(position.y > 900) { if(position.y > 900) {
outOfBounds = true; // jeżeli wyszedł poza granice ekranu ustaw tą zmienną outOfBounds = true; // jeżeli wyszedł poza granice ekranu ustaw tą zmienną
} }

View File

@@ -1,7 +1,6 @@
#include "../headers/Meteor.h" #include "../headers/Meteor.h"
Meteor::Meteor(float x, float y, sf::Texture &texture) : ObjectItem(x, y, texture) { Meteor::Meteor(float x, float y, sf::Texture &texture) : ObjectItem(x, y, texture) {
outOfBounds = false;
texture_ = texture; texture_ = texture;
sprite.setTexture(texture); sprite.setTexture(texture);
sprite.setOrigin(sprite.getLocalBounds().width / 2, sprite.getLocalBounds().height / 2); // wycentrowanie sprite sprite.setOrigin(sprite.getLocalBounds().width / 2, sprite.getLocalBounds().height / 2); // wycentrowanie sprite

View File

@@ -1,6 +1,7 @@
#include "../headers/ObjectItem.hpp" #include "../headers/ObjectItem.hpp"
ObjectItem::ObjectItem(float x, float y, sf::Texture &texture) { ObjectItem::ObjectItem(float x, float y, sf::Texture &texture) {
outOfBounds = false;
Position position_ = {0,0}; Position position_ = {0,0};
position_.x = static_cast<int>(x); position_.x = static_cast<int>(x);
position_.y = static_cast<int>(y); position_.y = static_cast<int>(y);

View File

@@ -21,8 +21,12 @@ Plansza::Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::Render
} else { } else {
playerTexture.loadFromFile("../assets/ship/Dreadnought-Base.png"); playerTexture.loadFromFile("../assets/ship/Dreadnought-Base.png");
} }
// Ładowanie tekstur itemów
meteorTexture1.loadFromFile("../assets/img/meteors/meteor-1.png"); meteorTexture1.loadFromFile("../assets/img/meteors/meteor-1.png");
meteorTexture2.loadFromFile("../assets/img/meteors/meteor-2.png"); meteorTexture2.loadFromFile("../assets/img/meteors/meteor-2.png");
heartTexture.loadFromFile("../assets/img/hearts/heart.png");
heartTextureGray.loadFromFile("../assets/img/hearts/heart_gray.png");
powerUpTexture.loadFromFile("../assets/img/powerups/PUSpeed.png");
// Ładowanie tekstur wrogów // Ładowanie tekstur wrogów
enemyTexture.loadFromFile("../assets/img/enemy/enemy.png"); enemyTexture.loadFromFile("../assets/img/enemy/enemy.png");
advancedEnemyTexture.loadFromFile("../assets/img/enemy/advanced_enemy.png"); advancedEnemyTexture.loadFromFile("../assets/img/enemy/advanced_enemy.png");
@@ -50,12 +54,6 @@ Plansza::Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::Render
audioManager.loadSoundEffect("shoot_alt", "../assets/sounds/shoot_alt.ogg"); audioManager.loadSoundEffect("shoot_alt", "../assets/sounds/shoot_alt.ogg");
audioManager.loadSoundEffect("fail", "../assets/sounds/fail.mp3"); audioManager.loadSoundEffect("fail", "../assets/sounds/fail.mp3");
meteorTexture1.loadFromFile("../assets/img/meteors/meteor-1.png");
meteorTexture2.loadFromFile("../assets/img/meteors/meteor-2.png");
heartTexture.loadFromFile("../assets/img/hearts/heart.png");
heartTextureGray.loadFromFile("../assets/img/hearts/heart_gray.png");
heartStats.emplace_back(heartTexture); heartStats.emplace_back(heartTexture);
heartStats.emplace_back(heartTexture); heartStats.emplace_back(heartTexture);
heartStats.emplace_back(heartTexture); heartStats.emplace_back(heartTexture);
@@ -64,6 +62,7 @@ Plansza::Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::Render
heartStats[2].setPosition(495, 10); heartStats[2].setPosition(495, 10);
meteorSpawnClock.restart(); meteorSpawnClock.restart();
powerUpSpawnClock.restart();
spawn_player(); spawn_player();
spawnClock.restart(); spawnClock.restart();
@@ -111,13 +110,14 @@ void Plansza::update() {
ship->update(); // migotanie statku ship->update(); // migotanie statku
update_score(); // naliczanie punktów update_score(); // naliczanie punktów
// Sprawnowanie wszystkich rodzajów wrogów // Sprawnowanie wszystkich rodzajów wrogów
spawn_meteor(); // spawn_meteor();
spawn_hearts(); // spawn_hearts();
spawn_enemy(); spawn_power_up();
spawn_advanced_enemy(); // spawn_enemy();
spawn_wiazkowiec(); // spawn_advanced_enemy();
spawn_bomber(); // spawn_wiazkowiec();
spawn_kamikadze(); // spawn_bomber();
// spawn_kamikadze();
// utrzymanie meteorów i pocisków w ruchu // utrzymanie meteorów i pocisków w ruchu
for (auto &meteor: meteors) { for (auto &meteor: meteors) {
@@ -130,6 +130,11 @@ void Plansza::update() {
window->draw(heart.getSprite()); window->draw(heart.getSprite());
} }
for (auto &powerUp: powerUps) {
powerUp.update();
window->draw(powerUp.getSprite());
}
for (auto &bullet: ship->getBullets()) { for (auto &bullet: ship->getBullets()) {
bullet.update(); bullet.update();
window->draw(bullet.getSprite()); window->draw(bullet.getSprite());
@@ -162,6 +167,16 @@ void Plansza::update() {
} }
} }
// TODO: Dodać obsługę kilku różnych power-upów
for (auto powerUpIt = powerUps.begin(); powerUpIt != powerUps.end();) {
if (ship->getSprite().getGlobalBounds().intersects(powerUpIt->getSprite().getGlobalBounds())) {
ship->setMovingSpeed(10.0f);
powerUpIt = powerUps.erase(powerUpIt);
} else {
++powerUpIt;
}
}
for (auto meteorIt = getMeteors().begin(); meteorIt != getMeteors().end();) { for (auto meteorIt = getMeteors().begin(); meteorIt != getMeteors().end();) {
bool meteorHit = false; bool meteorHit = false;
for (auto rocketIt = ship->getBullets().begin(); rocketIt != ship->getBullets().end();) { for (auto rocketIt = ship->getBullets().begin(); rocketIt != ship->getBullets().end();) {
@@ -706,6 +721,23 @@ void Plansza::update_meteors() {
} }
} }
void Plansza::update_hearts() {
// usuwanie serduszek, które wyleciały poza ekran
for (auto& heart : hearts) {
if(heart.getStatus()) {
hearts.erase(hearts.begin());
}
}
}
void Plansza::update_power_ups() {
for (auto& power : powerUps) {
if(power.getStatus()) {
powerUps.erase(powerUps.begin());
}
}
}
void Plansza::spawn_meteor() { void Plansza::spawn_meteor() {
if (meteorSpawnClock.getElapsedTime().asSeconds() > rand() % 10 + 1) { // randomowy spawn meteorytów od 10 do 1 sekundy 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 (meteors.size() < 5) { // jeśli jest mniej niż 5 meteorów na planszy
@@ -728,12 +760,12 @@ void Plansza::spawn_hearts() {
} }
} }
void Plansza::update_hearts() { void Plansza::spawn_power_up() {
// usuwanie serduszek, które wyleciały poza ekran if (powerUpSpawnClock.getElapsedTime().asSeconds() > 5) {
for (auto& heart : hearts) { if (powerUps.size() < 2) {
if(heart.getStatus()) { powerUps.emplace_back(RandomNumberGenerator::getRandomNumber(50, 499), -100, powerUpTexture);
hearts.erase(hearts.begin());
} }
powerUpSpawnClock.restart();
} }
} }

View File

@@ -1 +1,20 @@
#include "../headers/PowerUp.h" #include "../headers/PowerUp.h"
PowerUp::PowerUp(float x, float y, sf::Texture &texture): ObjectItem(x, y, texture) {
position.x = x;
position.y = y;
texture_ = texture;
sprite.setTexture(texture);
sprite.setOrigin(sprite.getLocalBounds().width / 2, sprite.getLocalBounds().height / 2); // wycentrowanie sprite
sprite.setScale(0.5f, 0.5f);
sprite.setPosition(x, y);
movingSpeed = 3.0f;
}
void PowerUp::update() {
sprite.move(0.0f, movingSpeed); // przesunięcie sprajta
position.y += int(movingSpeed); // przesunięcie pozycji
if(position.y > 900) {
outOfBounds = true; // jeżeli wyszedł poza granice ekranu ustaw tą zmienną
}
}