This repository has been archived on 2025-06-06. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
LotoStatek/sources/Player.cpp
2024-12-19 16:01:21 +01:00

109 lines
3.0 KiB
C++

#include "../headers/Player.h"
#include <iostream>
#include <SFML/Graphics/Font.hpp>
#include <SFML/Graphics/Text.hpp>
#include "../headers/Plansza.h"
Player::Player(int x, int y, const sf::Texture& texture) : Actor(x, y, texture) {
hp = 3;
if(Plansza::selectedShip != none) {
actorSprite.setScale(0.20f, 0.20f);
}
}
Player* Player::getInstance(int x, int y, const sf::Texture& texture) {
if (player_ == nullptr) {
player_ = new Player(x, y, texture);
}
return player_;
}
void Player::loadTexture() {
bulletTexture.loadFromFile("../assets/img/bullets/bullet_pink.png");
rocketTexture.loadFromFile("../assets/img/rockets/Rocket_111.png");
damageDealClock.restart();
originalColor = actorSprite.getColor();
}
void Player::shoot() {
auto now = std::chrono::steady_clock::now();
if (std::chrono::duration_cast<std::chrono::milliseconds>(now - lastShotTime).count() >= firerate) {
bullets.emplace_back(position.x, position.y, bulletTexture);
lastShotTime = now;
}
}
void Player::alternate_shoot() {
auto now = std::chrono::steady_clock::now();
if (std::chrono::duration_cast<std::chrono::milliseconds>(now - lastShotTime).count() >= firerate) {
rockets.emplace_back(position.x, position.y, rocketTexture).getSprite().scale(1.5f, 1.5f);
lastShotTime = now;
}
}
void Player::update() {
// Wyłącz nieśmiertelność po określonym czasie
if (isImmortal && immortalityClock.getElapsedTime().asSeconds() >= immortalityDuration) {
isImmortal = false;
std::cout << "Immortality ended.\n";
}
// Efekt migania podczas nieśmiertelności
if (isImmortal) {
if (static_cast<int>(immortalityClock.getElapsedTime().asMilliseconds() / 200) % 2 == 0) {
actorSprite.setColor(sf::Color(255, 255, 255, 128)); // Półprzezroczysty
} else {
actorSprite.setColor(sf::Color(255, 255, 255, 255)); // Normalny
}
} else {
actorSprite.setColor(sf::Color(255, 255, 255, 255)); // Normalny
}
}
void Player::takeDamage() {
if (!isImmortal) {
if (hp > 0) {
hp--;
isImmortal = true; // Aktywuj chwilową nieśmiertelność
immortalityClock.restart();
}
}
}
void Player::setFirerate(unsigned int firerate) {
this->firerate = firerate;
}
void Player::move(float deltaX, float deltaY) {
actorSprite.move(deltaX, deltaY);
}
void Player::moveLeft() {
move(-moving_speed, 0.0f);
position.x -= static_cast<int>(moving_speed);
}
void Player::moveRight() {
move(moving_speed, 0.0f);
position.x += static_cast<int>(moving_speed);
}
void Player::moveUp() {
move(0.0f, -moving_speed);
position.y -= static_cast<int>(moving_speed);
}
void Player::moveDown() {
move(0.0f, moving_speed);
position.y += static_cast<int>(moving_speed);
}
std::vector<Rocket> &Player::getRockets() {
return rockets;
}
Player* Player::player_ = nullptr;