From 90fdc8ed1b0ea7535f33726e7cd8e4af454c4d5b Mon Sep 17 00:00:00 2001 From: Jonathan Trottier Date: Mon, 2 Oct 2023 15:55:45 -0400 Subject: [PATCH] =?UTF-8?q?deux=20m=C3=A9thodes=20pour=20afficher=20messag?= =?UTF-8?q?e=20systeme=20et=20notification=20de=20kill?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SQCSim2021/engine.cpp | 187 ++++++++++++++++++++++++++++++++++++++++++ SQCSim2021/engine.h | 10 ++- SQCSim2021/player.cpp | 2 +- 3 files changed, 197 insertions(+), 2 deletions(-) diff --git a/SQCSim2021/engine.cpp b/SQCSim2021/engine.cpp index a7ca3d4..8891056 100644 --- a/SQCSim2021/engine.cpp +++ b/SQCSim2021/engine.cpp @@ -4,6 +4,24 @@ #include "transformation.h" #include "player.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() { @@ -100,6 +118,150 @@ 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() / 2.0f; + 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::ProcessNotificationQueue() { +// // Process the notification queue +// float yOffset = 0.0f; // Offset to stack notifications vertically +// while (!notificationQueue.empty()) { +// Notification currentNotification = notificationQueue.front(); +// +// // Calculate the time since the notification was displayed +// float timeSinceDisplay = m_time - currentNotification.displayStartTime; +// +// // Check if it's time to remove the notification (display for 2 seconds) +// if (timeSinceDisplay < 5.0f) { +// 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(); +// // Display the notification message with vertical offset +// m_textureFont.Bind(); +// std::ostringstream ss; +// float scale = GetScale(); +// unsigned int x = Width() / 25; +// unsigned int y = Height() - (Height() / 2.2) - yOffset; +// +// ss << currentNotification.message; +// PrintText(x, y, scale, ss.str()); +// +// // Increase the vertical offset for the next notification +// yOffset += 20.0f; // Adjust as needed for spacing +// 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(); +// // Remove the top notification from the queue +// //notificationQueue.pop(); +// break; +// } +// else { +// // No need to remove the notification; it has already expired +// notificationQueue.pop(); +// } +// } +//} + + + void Engine::DisplayCrosshair() { m_textureCrosshair.Bind(); static const int crossSize = 32; @@ -249,6 +411,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); } @@ -393,6 +566,7 @@ void Engine::Render(float elapsedTime) { if (m_isSkybox) m_skybox.Render(skybox); + ProcessNotificationQueue(); DrawHud(elapsedTime, bloc); static bool fell = false; @@ -444,6 +618,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 @@ -492,6 +673,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 0d7156f..b2a58cb 100644 --- a/SQCSim2021/engine.h +++ b/SQCSim2021/engine.h @@ -39,6 +39,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); @@ -64,7 +68,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; @@ -83,6 +87,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; @@ -93,6 +99,8 @@ private: bool m_mouseC = false; bool m_mouseWU = false; bool m_mouseWD = false; + + std::string m_messageNotification = ""; }; #endif // ENGINE_H__ diff --git a/SQCSim2021/player.cpp b/SQCSim2021/player.cpp index f5313c7..a25342b 100644 --- a/SQCSim2021/player.cpp +++ b/SQCSim2021/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) {