diff --git a/SQCSim-common/player.cpp b/SQCSim-common/player.cpp index 2043dd9..9fe810c 100644 --- a/SQCSim-common/player.cpp +++ b/SQCSim-common/player.cpp @@ -5,7 +5,7 @@ Player::Player(const Vector3f& position, float rotX, float rotY) : m_position(po m_velocity = Vector3f(0, 0, 0); m_airborne = true; m_hp = 0.75f; //TODO: Remettre à 1.0f - m_username = "Zelda Bee-Bop"; + m_username = "Zelda Bee-Bop56"; } void Player::TurnLeftRight(float value) { diff --git a/SQCSim2021/define.h b/SQCSim2021/define.h index e946a35..9c4a040 100644 --- a/SQCSim2021/define.h +++ b/SQCSim2021/define.h @@ -20,8 +20,8 @@ #define SRV_ADDR "127.0.0.1" #define COUNTDOWN 300 -#define BASE_WIDTH 640 -#define BASE_HEIGHT 480 +#define BASE_WIDTH 1920 +#define BASE_HEIGHT 1080 #define TEXTURE_PATH "./media/textures/" #define SHADER_PATH "./media/shaders/" diff --git a/SQCSim2021/engine.cpp b/SQCSim2021/engine.cpp index 5c670b3..f44eb96 100644 --- a/SQCSim2021/engine.cpp +++ b/SQCSim2021/engine.cpp @@ -1,5 +1,23 @@ #include "engine.h" +#include +#include +#include +#include + + + +// Define a structure to represent notifications +struct Notification { + std::string message; + float displayStartTime = 0.0f; +}; + +// Use a queue to manage notifications +//std::queue notificationQueue; +// Use a vector to manage notifications +std::vector notifications; + Engine::Engine() {} Engine::~Engine() { @@ -113,6 +131,91 @@ void Engine::LoadResource() { void Engine::UnloadResource() {} +void Engine::SystemNotification(std::string systemLog) { + std::string message = ""; + + message = systemLog; + + DisplayNotification(message); +} +void Engine::KillNotification(Player killer, Player killed) { + std::string message = ""; + + message = killed.GetUsername() + " killed by -> " + killer.GetUsername(); + + DisplayNotification(message); +} + + +void Engine::DisplayNotification(std::string message) { + + if (message.length() > 45) { + message = message.substr(0, 45); + } + // Create a new notification and add it to the queue + Notification newNotification; + newNotification.message = message; + newNotification.displayStartTime = m_time; + + notifications.push_back(newNotification); +} + +// Add a method to process the notification queue +void Engine::ProcessNotificationQueue() { + m_textureFont.Bind(); + float scale = GetScale(); + unsigned int xOffset = Width() - Width() * 0.26; + unsigned int yOffset = Height() - (Height() / 2.2); + + // Iterate through the notifications and display them + for (auto it = notifications.begin(); it != notifications.end(); ) { + float timeSinceDisplay = m_time - it->displayStartTime; + + // Display the notification message with vertical offset + unsigned int y = yOffset - (static_cast(scale * 20) * (it - notifications.begin())); + glDisable(GL_STENCIL_TEST); + glDisable(GL_DEPTH_TEST); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glBlendEquation(GL_FUNC_ADD); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + + glLoadIdentity(); + glOrtho(0, Width(), 0, Height(), -1, 1); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + + + + PrintText(xOffset, y, scale, it->message); + + glBlendFunc(GL_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR); + glBlendEquation(GL_FUNC_SUBTRACT); + + glEnable(GL_STENCIL_TEST); + glEnable(GL_DEPTH_TEST); + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + // Check if it's time to remove the notification (display for 2 seconds) + if (timeSinceDisplay >= 4.0f) { + it = notifications.erase(it); // Remove the notification + } + else { + ++it; + } + } + +} + + + void Engine::DisplayCrosshair() { m_textureCrosshair.Bind(); static const int crossSize = 32; @@ -261,6 +364,17 @@ void Engine::DrawHud(float elapsedTime, BlockType bloc) { int timer = GetCountdown(elapsedTime); + // Appel de la fonction pour l'affichage de notifications + if (m_keyK) { + SystemNotification(m_messageNotification); + m_keyK = false; + } + if (m_keyL) { + + KillNotification(m_player, m_player); + m_keyL = false; + } + if (m_displayInfo) { DisplayInfo(elapsedTime, bloc); } @@ -423,6 +537,7 @@ void Engine::Render(float elapsedTime) { if (m_isSkybox) m_skybox.Render(skybox); + ProcessNotificationQueue(); DrawHud(elapsedTime, bloc); static bool fell = false; @@ -474,6 +589,13 @@ void Engine::KeyPressEvent(unsigned char key) { break; case 5: // F - Ignorer break; + case 10: // K - Debugging DisplayNotification() + m_keyK = true; + m_messageNotification = "notifications systeme peuvent être affiché"; + break; + case 11: // L - Debugging DisplayNotification() + m_keyL = true; + break; case 6: // G - Ignorer break; case 12: // M - Ignorer @@ -522,6 +644,12 @@ void Engine::KeyReleaseEvent(unsigned char key) { m_displayInfo = !m_displayInfo; std::cout << "DISPLAY INFO " << (m_displayInfo ? "enabled" : "disabled") << std::endl; break; + case 10: // K + m_keyK = false; + break; + case 11: // L - Debugging DisplayNotification() + m_keyL = false; + break; case 12: // M - Toggle music m_audio.ToggleMusicState(); break; diff --git a/SQCSim2021/engine.h b/SQCSim2021/engine.h index e2a291f..fa3a088 100644 --- a/SQCSim2021/engine.h +++ b/SQCSim2021/engine.h @@ -43,6 +43,10 @@ private: bool LoadTexture(Texture& texture, const std::string& filename, bool useMipmaps = true, bool stopOnError = true); + void SystemNotification(std::string systemLog); + void KillNotification(Player killer, Player killed); + void DisplayNotification(std::string message); + void ProcessNotificationQueue(); void DisplayCrosshair(); void DisplayCurrentItem(); void DisplayHud(int timer); @@ -70,7 +74,7 @@ private: irrklang::ISound* m_scream; Player m_player = Player(Vector3f(.5f, CHUNK_SIZE_Y + 1.8f, .5f)); - + Bullet* m_bullets[MAX_BULLETS]; float m_scale; @@ -89,6 +93,8 @@ private: bool m_resetcountdown = false; bool m_stopcountdown = false; + bool m_keyK = false; + bool m_keyL = false; bool m_keyW = false; bool m_keyA = false; bool m_keyS = false; @@ -99,6 +105,8 @@ private: bool m_mouseC = false; bool m_mouseWU = false; bool m_mouseWD = false; + + std::string m_messageNotification = ""; }; #endif // ENGINE_H__