Files
bloubloulespoissons/Entities/player.cpp
2024-12-19 15:55:42 +01:00

253 lines
7.5 KiB
C++

#include "player.h"
void Player::updatePlayerPos(int x, int y) {
this->x = x;
this->y = y;
this->playerPosForRender.x = x;
this->playerPosForRender.y = y;
};
void Player::updatePlayerSpeed(int playerSpeed) {
this->playerSpeed = playerSpeed;
};
std::tuple<int, int> Player::getPlayerPos() const {
return std::make_tuple(this->x, this->y);
};
int Player::getPlayerSpeed() {
return playerSpeed;
};
void Player::draw(SDL_Renderer* renderer) {
switch (this->ticks) {
case 0:
this->currentSprite = PLAYER_SPRITE_1;
break;
case 50:
this->currentSprite = PLAYER_SPRITE_2;
break;
case 150:
this->currentSprite = PLAYER_SPRITE_3;
break;
default:
break;
}
if (this->ticks >= 150) {
this->ticks = 0;
} else {
this->ticks++;
}
SDL_RenderCopyEx(renderer, this->playerTexture, &this->playerRect[this->currentSprite], &this->playerPosForRender, 0, nullptr, this->currentFlip);
this->drawEnergyBar(renderer);
};
void Player::handlePlayerMovement(int ENV_WIDTH, int ENV_HEIGHT, int windowWidth, int windowHeight) {
const Uint8* keystate = SDL_GetKeyboardState(NULL);
Camera& camera = Camera::getInstance();
int tempX = this->x;
int tempY = this->y;
int speed = this->playerSpeed;
bool isSprinting = false;
/*
if (keystate[SDL_SCANCODE_LSHIFT]) {
speed = this->playerSpeed * 2;
isSprinting = true;
}
*/
bool moved = false;
if (this->energy != 0) {
if (isPlayingOnline) {
if (keystate[SDL_SCANCODE_W] || keystate[SDL_SCANCODE_S] || keystate[SDL_SCANCODE_A] || keystate[SDL_SCANCODE_D]) {
moved = onlineMovement();
}
} else {
if (keystate[SDL_SCANCODE_W]) {
if (camera.getY() > 0 && tempY == this->playerBaseY) {
camera.move(0, -speed);
unifiedX = camera.getX() + this->x;
} else if (tempY > 0) {
tempY -= speed;
unifiedX = camera.getX() + this->x;
}
moved = true;
}
if (keystate[SDL_SCANCODE_S]) {
if ((camera.getY() < ENV_HEIGHT - windowHeight) && (tempY == this->playerBaseY)) {
camera.move(0, speed);
unifiedX = camera.getX() + this->x;
} else if (tempY < windowHeight - PLAYER_SIZE_Y) {
tempY += speed;
unifiedX = camera.getX() + this->x;
}
moved = true;
}
if (keystate[SDL_SCANCODE_A]) {
if (camera.getX() > 0 && (tempX == this->playerBaseX)) {
camera.move(-speed, 0);
this->currentFlip = SDL_FLIP_HORIZONTAL;
unifiedY = camera.getY() + this->y;
} else if (tempX > 0) {
tempX -= speed;
this->currentFlip = SDL_FLIP_HORIZONTAL;
unifiedY = camera.getY() + this->y;
}
moved = true;
}
if (keystate[SDL_SCANCODE_D]) {
if (camera.getX() < ENV_WIDTH - windowWidth && (tempX == this->playerBaseX)) {
camera.move(speed, 0);
this->currentFlip = SDL_FLIP_NONE;
unifiedY = camera.getY() + this->y;
} else if (tempX < windowWidth - PLAYER_SIZE_X) {
tempX += speed;
this->currentFlip = SDL_FLIP_NONE;
unifiedY = camera.getY() + this->y;
}
moved = true;
}
if (tempX < 0) {
tempX = 0;
} else if (tempX > ENV_WIDTH) {
tempX = ENV_WIDTH;
}
if (tempY < 0) {
tempY = 0;
} else if (tempY > ENV_HEIGHT) {
tempY = ENV_HEIGHT;
}
this->updatePlayerPos(tempX, tempY);
}
}
if (moved) {
lastMoveTime = SDL_GetTicks();
if (!isSprinting) {
this->energy -= 0.1f;
} else {
this->energy -= 0.2f;
}
if (this->energy < 0) {
this->energy = 0;
}
unifiedX = camera.getX() + this->x;
unifiedY = camera.getY() + this->y;
} else {
Uint32 currentTime = SDL_GetTicks();
if (currentTime - lastMoveTime >= 1000) {
if (this->energy > 50.0f) {
this->energy += 0.4f; // Récupération plus rapide si l'énergie est élevée
} else {
this->energy += 0.2f; // Récupération plus lente si l'énergie est faible
}
if (this->energy > 100.0f) {
this->energy = 100.0f;
}
}
unifiedX = camera.getX() + this->x;
unifiedY = camera.getY() + this->y;
}
}
void Player::drawEnergyBar(SDL_Renderer* renderer) {
SDL_Rect energyBarBackground = {10, 10, 200, 20};
SDL_Rect energyBarForeground = {10, 10, static_cast<int>(2 * this->energy), 20};
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
SDL_RenderFillRect(renderer, &energyBarBackground);
SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
SDL_RenderFillRect(renderer, &energyBarForeground);
}
int Player::getPlayerId() const {
return playerId;
}
void Player::setPlayerPos(int x, int y) {
this->x = x;
this->y = y;
this->playerPosForRender.x = x;
this->playerPosForRender.y = y;
}
void Player::handleClientMessages() {
std::string message = receiveMessage(client);
if (!message.empty()) {
std::cout << "Client received: " << message << std::endl;
if (message == "host;quit") {
std::cout << "Host has quit. Closing client..." << std::endl;
game_running = false;
return;
}
if (message.find(";moved;") != std::string::npos) {
int clientId, xCam, yCam;
sscanf(message.c_str(), "%d;moved;%d,%d", &clientId, &xCam, &yCam);
if (clientId == playerId) {
this->setPlayerPos(750, 400);
Camera& camera = Camera::getInstance();
if (xCam >= 0 && xCam <= ENV_WIDTH - windowWidth) {
if ( yCam >= 0 && yCam <= ENV_HEIGHT - windowHeight) {
camera.setPosition(xCam, yCam);
updatePosition(xCam, yCam);
}
}
}
}
}
}
bool Player::onlineMovement() {
const Uint8* keystate = SDL_GetKeyboardState(NULL);
std::string message = std::to_string(getPlayerId()) + ";move;";
bool moved = false;
if (keystate[SDL_SCANCODE_W]) {
message += "up-";
moved = true;
}
if (keystate[SDL_SCANCODE_S]) {
message += "down-";
moved = true;
}
if (keystate[SDL_SCANCODE_A]) {
message += "left-";
moved = true;
}
if (keystate[SDL_SCANCODE_D]) {
message += "right-";
moved = true;
}
if (moved) {
sendMessage(client, message);
return true;
}
return false;
}
void Player::updatePosition(int x, int y) {
int camX = x + windowWidth / 2;
int camY = y + windowHeight / 2;
unifiedX = camX;
unifiedY = camY;
}
int Player::getUnifiedX() {
return unifiedX;
}
int Player::getUnifiedY() {
return unifiedY;
}
int Player::getSpeed() {
return playerSpeed;
}