Compare commits
3 Commits
5Przeciwni
...
1298bab79a
| Author | SHA1 | Date | |
|---|---|---|---|
| 1298bab79a | |||
| 9929a5dd40 | |||
| 74c739a09e |
@@ -1,24 +1,20 @@
|
|||||||
#ifndef PLANSZA_H
|
#ifndef PLANSZA_H
|
||||||
#define PLANSZA_H
|
#define PLANSZA_H
|
||||||
|
|
||||||
|
#include "SFML/System/Clock.hpp"
|
||||||
|
#include "SFML/Graphics/RenderWindow.hpp"
|
||||||
|
|
||||||
#include "Meteor.h"
|
#include "Meteor.h"
|
||||||
#include "Enemy.h"
|
#include "Enemy.h"
|
||||||
#include "AdvancedEnemy.h"
|
#include "AdvancedEnemy.h"
|
||||||
#include "Bomber.h"
|
#include "Bomber.h"
|
||||||
#include "Kamikadze.h"
|
#include "Kamikadze.h"
|
||||||
#include "Wiazkowiec.h"
|
#include "Wiazkowiec.h"
|
||||||
#include "Beam.h"
|
|
||||||
#include "RandomNumberGenerator.h"
|
|
||||||
#include "SFML/System/Clock.hpp"
|
|
||||||
#include "SFML/Graphics/RenderWindow.hpp"
|
|
||||||
#include "Size.h"
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
#include "Player.h"
|
#include "Player.h"
|
||||||
#include "Background.h"
|
#include "Background.h"
|
||||||
#include "AudioManager.h"
|
#include "AudioManager.h"
|
||||||
#include "Meteor.h"
|
|
||||||
#include "Plansza.h"
|
#include "Plansza.h"
|
||||||
|
#include "Size.h"
|
||||||
|
|
||||||
class Plansza {
|
class Plansza {
|
||||||
public:
|
public:
|
||||||
@@ -26,18 +22,16 @@ public:
|
|||||||
const sf::Texture& playerTexture, const sf::Texture& playerBulletTexture, const sf::Texture& playerRocketTexture);
|
const sf::Texture& playerTexture, const sf::Texture& playerBulletTexture, const sf::Texture& playerRocketTexture);
|
||||||
Size getSize();
|
Size getSize();
|
||||||
std::vector<Meteor> &getMeteors();
|
std::vector<Meteor> &getMeteors();
|
||||||
|
|
||||||
|
|
||||||
void spawn_meteor();
|
void spawn_meteor();
|
||||||
void update_meteors();
|
void update_meteors();
|
||||||
void update();
|
void update();
|
||||||
|
void update_score();
|
||||||
void spawn_enemy();
|
void spawn_enemy();
|
||||||
void setOutOfBounds(bool status);
|
void setOutOfBounds(bool status);
|
||||||
void spawn_advanced_enemy();
|
void spawn_advanced_enemy();
|
||||||
void spawn_wiazkowiec();
|
void spawn_wiazkowiec();
|
||||||
void spawn_bomber();
|
void spawn_bomber();
|
||||||
void spawn_kamikadze();
|
void spawn_kamikadze();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Size size;
|
Size size;
|
||||||
Background background;
|
Background background;
|
||||||
@@ -57,6 +51,7 @@ private:
|
|||||||
sf::Texture KamikadzeTexture;
|
sf::Texture KamikadzeTexture;
|
||||||
sf::Texture WiazkowiecTexture;
|
sf::Texture WiazkowiecTexture;
|
||||||
sf::Clock spawnClock;
|
sf::Clock spawnClock;
|
||||||
|
sf::Clock scoreClock;
|
||||||
sf::Clock shooterSpawnClock;
|
sf::Clock shooterSpawnClock;
|
||||||
std::vector<Enemy> enemies;
|
std::vector<Enemy> enemies;
|
||||||
std::vector<AdvancedEnemy> AEnemies;
|
std::vector<AdvancedEnemy> AEnemies;
|
||||||
@@ -70,6 +65,8 @@ private:
|
|||||||
sf::Clock WiazkowiecSpawnClock;
|
sf::Clock WiazkowiecSpawnClock;
|
||||||
std::vector<Meteor> meteors;
|
std::vector<Meteor> meteors;
|
||||||
sf::RenderWindow *window;
|
sf::RenderWindow *window;
|
||||||
|
sf::Font font;
|
||||||
|
unsigned int score = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //PLANSZA_H
|
#endif //PLANSZA_H
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include "../headers/Plansza.h"
|
#include "../headers/Plansza.h"
|
||||||
#include "../headers/ObjectItem.hpp"
|
#include "../headers/ObjectItem.hpp"
|
||||||
|
#include "../headers/RandomNumberGenerator.h"
|
||||||
|
|
||||||
Plansza::Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::RenderWindow *mainWindow,
|
Plansza::Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::RenderWindow *mainWindow,
|
||||||
const sf::Texture& playerTexture,
|
const sf::Texture& playerTexture,
|
||||||
@@ -14,6 +15,13 @@ Plansza::Plansza(unsigned int windowHeight, unsigned int windowWidth, sf::Render
|
|||||||
size.height = static_cast<int>(windowHeight);
|
size.height = static_cast<int>(windowHeight);
|
||||||
size.width = static_cast<int>(windowWidth);
|
size.width = static_cast<int>(windowWidth);
|
||||||
|
|
||||||
|
score = 0;
|
||||||
|
|
||||||
|
// Wczytywanie czcionki dla licznika punktów
|
||||||
|
if (!font.loadFromFile("../assets/fonts/arial.ttf")) {
|
||||||
|
std::cerr << "Error loading font\n";
|
||||||
|
exit(-500);
|
||||||
|
}
|
||||||
|
|
||||||
ship.setMovingSpeed(8);
|
ship.setMovingSpeed(8);
|
||||||
ship.setFirerate(200);
|
ship.setFirerate(200);
|
||||||
@@ -25,34 +33,39 @@ 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");
|
||||||
|
|
||||||
|
if (!meteorTexture1.loadFromFile("../assets/img/meteors/meteor-1.png")) {
|
||||||
meteorTexture1.loadFromFile("../assets/img/meteors/meteor-1.png");
|
std::cerr << "Failed to load enemy texture!" << std::endl;
|
||||||
meteorTexture2.loadFromFile("../assets/img/meteors/meteor-2.png");
|
exit(-500);
|
||||||
|
}
|
||||||
|
if (!meteorTexture2.loadFromFile("../assets/img/meteors/meteor-2.png")) {
|
||||||
|
std::cerr << "Failed to load enemy texture!" << std::endl;
|
||||||
|
exit(-500);
|
||||||
|
}
|
||||||
|
|
||||||
// Ładowanie tekstur wrogów
|
// Ładowanie tekstur wrogów
|
||||||
if (!enemyTexture.loadFromFile("../assets/img/enemy/enemy.png")) {
|
if (!enemyTexture.loadFromFile("../assets/img/enemy/enemy.png")) {
|
||||||
std::cerr << "Failed to load enemy texture!" << std::endl;
|
std::cerr << "Failed to load enemy texture!" << std::endl;
|
||||||
exit(-1);
|
exit(-500);
|
||||||
}
|
}
|
||||||
if (!advancedEnemyTexture.loadFromFile("../assets/img/enemy/advanced_enemy.png")) {
|
if (!advancedEnemyTexture.loadFromFile("../assets/img/enemy/advanced_enemy.png")) {
|
||||||
std::cerr << "Failed to load advanced enemy texture!" << std::endl;
|
std::cerr << "Failed to load advanced enemy texture!" << std::endl;
|
||||||
exit(-1);
|
exit(-500);
|
||||||
}
|
}
|
||||||
if (!BomberEnemyTexture.loadFromFile("../assets/img/enemy/bomber.png")) {
|
if (!BomberEnemyTexture.loadFromFile("../assets/img/enemy/bomber.png")) {
|
||||||
std::cerr << "Failed to load advanced enemy texture!" << std::endl;
|
std::cerr << "Failed to load advanced enemy texture!" << std::endl;
|
||||||
exit(-1);
|
exit(-500);
|
||||||
}
|
}
|
||||||
if (!KamikadzeTexture.loadFromFile("../assets/img/enemy/kamikadze.png")) {
|
if (!KamikadzeTexture.loadFromFile("../assets/img/enemy/kamikadze.png")) {
|
||||||
std::cerr << "Failed to load advanced enemy texture!" << std::endl;
|
std::cerr << "Failed to load advanced enemy texture!" << std::endl;
|
||||||
exit(-1);
|
exit(-500);
|
||||||
}
|
}
|
||||||
if (!BombaTexture.loadFromFile("../assets/img/bullets/bomba.png")) {
|
if (!BombaTexture.loadFromFile("../assets/img/bullets/bomba.png")) {
|
||||||
std::cerr << "Failed to load BombaTexture!" << std::endl;
|
std::cerr << "Failed to load BombaTexture!" << std::endl;
|
||||||
exit(-1);
|
exit(-500);
|
||||||
}
|
}
|
||||||
if (!WiazkowiecTexture.loadFromFile("../assets/img/enemy/wiazkowiec.png")) {
|
if (!WiazkowiecTexture.loadFromFile("../assets/img/enemy/wiazkowiec.png")) {
|
||||||
std::cerr << "Failed to load Wiazkowiec texture!" << std::endl;
|
std::cerr << "Failed to load Wiazkowiec texture!" << std::endl;
|
||||||
exit(-1);
|
exit(-500);
|
||||||
}
|
}
|
||||||
spawnClock.restart();
|
spawnClock.restart();
|
||||||
}
|
}
|
||||||
@@ -96,7 +109,9 @@ void Plansza::update() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// generowanie nowego meteoru
|
// generowanie nowego meteoru
|
||||||
ship.update();
|
ship.update(); // migotanie statku
|
||||||
|
update_score(); // naliczanie punktów
|
||||||
|
// Sprawnowanie wszystkich rodzajów wrogów
|
||||||
spawn_meteor();
|
spawn_meteor();
|
||||||
spawn_enemy();
|
spawn_enemy();
|
||||||
spawn_advanced_enemy();
|
spawn_advanced_enemy();
|
||||||
@@ -126,44 +141,13 @@ void Plansza::update() {
|
|||||||
|
|
||||||
window->draw(ship.getSprite());
|
window->draw(ship.getSprite());
|
||||||
|
|
||||||
// trochę dziwny sposób ale jednak działa
|
|
||||||
for (auto& meteor : getMeteors()) {
|
for (auto& meteor : getMeteors()) {
|
||||||
if(ship.getSprite().getGlobalBounds().intersects(meteor.getSprite().getGlobalBounds())) {
|
if(ship.getSprite().getGlobalBounds().intersects(meteor.getSprite().getGlobalBounds())) {
|
||||||
std::cout << "You lost the game!\n";
|
ship.takeDamage();
|
||||||
sf::RenderWindow errorWindow(sf::VideoMode(350, 200), "The end");
|
|
||||||
sf::Font font;
|
|
||||||
if (!font.loadFromFile("../assets/fonts/arial.ttf")) {
|
|
||||||
std::cerr << "Error loading font\n";
|
|
||||||
exit(-500);
|
|
||||||
}
|
|
||||||
sf::Text text("Your ship is destroyed!", font, 24);
|
|
||||||
text.setFillColor(sf::Color::Red);
|
|
||||||
text.setPosition(50, 80);
|
|
||||||
|
|
||||||
// zatrzymanie muzyki i odtworzenie dźwięku przegranej
|
|
||||||
audioManager.playSoundEffect("fail", 70.f);
|
|
||||||
audioManager.stopBackgroundMusic();
|
|
||||||
sf::Event event{};
|
|
||||||
while (errorWindow.isOpen()) {
|
|
||||||
while (errorWindow.pollEvent(event)) {
|
|
||||||
if (event.type == sf::Event::Closed || sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) {
|
|
||||||
errorWindow.close();
|
|
||||||
window->close();
|
|
||||||
exit(-2);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
errorWindow.clear();
|
|
||||||
errorWindow.draw(text);
|
|
||||||
errorWindow.display();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (!ship.isAlive()) {
|
if (!ship.isAlive()) {
|
||||||
std::cout << "Game Over! Player is dead." << std::endl;
|
|
||||||
std::cout << "You lost the game!\n";
|
|
||||||
sf::RenderWindow errorWindow(sf::VideoMode(350, 200), "The end");
|
sf::RenderWindow errorWindow(sf::VideoMode(350, 200), "The end");
|
||||||
sf::Font font;
|
sf::Font font;
|
||||||
if (!font.loadFromFile("../assets/fonts/arial.ttf")) {
|
if (!font.loadFromFile("../assets/fonts/arial.ttf")) {
|
||||||
@@ -209,22 +193,6 @@ void Plansza::update() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
// Ruch i render przeciwnika
|
||||||
for (auto it = enemies.begin(); it != enemies.end();) {
|
for (auto it = enemies.begin(); it != enemies.end();) {
|
||||||
it->update(); // Aktualizacja kierunku i ruchu
|
it->update(); // Aktualizacja kierunku i ruchu
|
||||||
@@ -353,10 +321,7 @@ void Plansza::update() {
|
|||||||
for (auto it = enemy.getBullets().begin(); it != enemy.getBullets().end();) {
|
for (auto it = enemy.getBullets().begin(); it != enemy.getBullets().end();) {
|
||||||
if (ship.getSprite().getGlobalBounds().intersects(it->getSprite().getGlobalBounds())) {
|
if (ship.getSprite().getGlobalBounds().intersects(it->getSprite().getGlobalBounds())) {
|
||||||
// Kolizja wykryta
|
// Kolizja wykryta
|
||||||
std::cout << "Player hit by enemy bullet!\n";
|
|
||||||
|
|
||||||
ship.takeDamage();
|
ship.takeDamage();
|
||||||
|
|
||||||
// Usuwanie pocisku
|
// Usuwanie pocisku
|
||||||
it = enemy.getBullets().erase(it);
|
it = enemy.getBullets().erase(it);
|
||||||
} else {
|
} else {
|
||||||
@@ -635,6 +600,16 @@ void Plansza::update() {
|
|||||||
|
|
||||||
// Meteor-related niżej
|
// Meteor-related niżej
|
||||||
|
|
||||||
|
|
||||||
|
void Plansza::update_meteors() {
|
||||||
|
// usuwanie meteorów które wyleciały poza ekran
|
||||||
|
for (auto& meteor : meteors) {
|
||||||
|
if(meteor.getStatus()) {
|
||||||
|
meteors.erase(meteors.begin());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Plansza::spawn_meteor() {
|
void Plansza::spawn_meteor() {
|
||||||
if (spawnClock.getElapsedTime().asSeconds() > rand() % 10 + 1) { // randomowy spawn meteorytów od 10 do 1 sekundy
|
if (spawnClock.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
|
||||||
@@ -648,15 +623,6 @@ void Plansza::spawn_meteor() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Plansza::update_meteors() {
|
|
||||||
// usuwanie meteorów które wyleciały poza ekran
|
|
||||||
for (auto& meteor : meteors) {
|
|
||||||
if(meteor.getStatus()) {
|
|
||||||
meteors.erase(meteors.begin());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Plansza::spawn_enemy() {
|
void Plansza::spawn_enemy() {
|
||||||
if (enemySpawnClock.getElapsedTime().asSeconds() >= 110) { // Spawn co 10 sekund
|
if (enemySpawnClock.getElapsedTime().asSeconds() >= 110) { // Spawn co 10 sekund
|
||||||
int spawnX = RandomNumberGenerator::getRandomNumber(50, size.width - 50);
|
int spawnX = RandomNumberGenerator::getRandomNumber(50, size.width - 50);
|
||||||
@@ -718,5 +684,18 @@ std::vector<Meteor> &Plansza::getMeteors() {
|
|||||||
return meteors;
|
return meteors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: naliczanie punktów za zabicie wrogów
|
||||||
|
void Plansza::update_score() {
|
||||||
|
if (scoreClock.getElapsedTime().asMilliseconds() > 500) {
|
||||||
|
score++;
|
||||||
|
scoreClock.restart();
|
||||||
|
}
|
||||||
|
|
||||||
|
sf::Text text(std::to_string(score), font, 24);
|
||||||
|
text.setFillColor(sf::Color::White);
|
||||||
|
text.setPosition(25, 25);
|
||||||
|
window->draw(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user