r-type  0.0.0
R-Type main
Loading...
Searching...
No Matches
GameMulti.hpp
Go to the documentation of this file.
1///
2/// @file GameMulti.hpp
3/// @brief Main multiplayer game scene for R-Type
4/// @details This file contains the primary gameplay scene for R-Type multiplayer mode.
5/// It manages game state synchronization with the server, entity interpolation,
6/// player controls, HUD rendering, and game logic. The scene handles real-time
7/// networking updates and provides smooth gameplay through client-side prediction
8/// and interpolation techniques.
9/// @namespace gme
10/// @author R-Type Team
11/// @date 2025
12///
13
14#pragma once
15
16#include <deque>
17#include <memory>
18#include <unordered_map>
19#include <unordered_set>
20#include <vector>
21
23#include "Interfaces/IAudio.hpp"
27#include "Utils/EventBus.hpp"
28
29namespace gme
30{
31 ///
32 /// @struct InterpolationData
33 /// @brief Data structure for entity position interpolation
34 /// @details Stores target and current position/velocity data for smooth entity movement.
35 /// Used to interpolate entity positions between server updates to provide
36 /// smooth visual rendering despite network latency.
37 ///
39 {
40 float targetX, targetY; ///< Target position from server update
41 float targetVx, targetVy; ///< Target velocity from server
42 float currentX, currentY; ///< Current interpolated position
43 float smoothFactor; ///< Interpolation smoothing factor (0.0-1.0)
44 float targetRotation; ///< Target rotation angle
45 float currentRotation; ///< Current interpolated rotation
46 };
47
48 ///
49 /// @class GameMulti
50 /// @brief Main multiplayer game scene handling networked gameplay
51 /// @details This scene manages the core multiplayer game loop including:
52 /// - Network synchronization with game server
53 /// - Local and remote player entity management
54 /// - Entity interpolation for smooth rendering
55 /// - Client-side prediction for responsive controls
56 /// - Enemy and projectile synchronization
57 /// - HUD and game state display
58 /// - Audio management (music and sound effects)
59 /// - Stage progression
60 ///
61 /// The scene uses event bus communication to receive world state updates from
62 /// the network client and applies interpolation to create smooth visuals despite
63 /// network latency and packet timing.
64 ///
65 /// @namespace gme
66 ///
67 class GameMulti final : public eng::AScene
68 {
69 public:
70 ///
71 /// @brief Constructor
72 /// @param assignedId Scene ID assigned by the engine
73 /// @param renderer Shared pointer to the renderer interface
74 /// @param audio Shared pointer to the audio interface
75 /// @param skinIndex Player skin/appearance index
76 /// @param showDebug Reference to debug mode flag
77 /// @param sessionId Network session ID of the local player
78 ///
79 GameMulti(eng::id assignedId, const std::shared_ptr<eng::IRenderer> &renderer,
80 const std::shared_ptr<eng::IAudio> &audio, float skinIndex, bool &showDebug, uint32_t sessionId);
81
82 ///
83 /// @brief Destructor
84 ///
85 ~GameMulti() override = default;
86
87 /// @brief Deleted copy constructor (non-copyable)
88 GameMulti(const GameMulti &other) = delete;
89 /// @brief Deleted copy assignment operator (non-copyable)
90 GameMulti &operator=(const GameMulti &other) = delete;
91 /// @brief Deleted move constructor (non-movable)
92 GameMulti(GameMulti &&other) = delete;
93 /// @brief Deleted move assignment operator (non-movable)
94 GameMulti &operator=(GameMulti &&other) = delete;
95
96 ///
97 /// @brief Update the game scene (called each frame)
98 /// @param dt Delta time since last frame (in seconds)
99 /// @param size Current window size
100 /// @details Processes network events, updates interpolation, runs game systems
101 ///
102 void update(float dt, const eng::WindowSize &size) override;
103
104 ///
105 /// @brief Handle input events
106 /// @param event Input event (keyboard, mouse, etc.)
107 ///
108 void event(const eng::Event &event) override;
109
110 ///
111 /// @brief Update the local player's visual skin/appearance
112 /// @details Updates player sprite based on skin index
113 ///
114 void updatePlayerSkin();
115
116 ///
117 /// @brief Get reference to music playback flag
118 /// @return Reference to music flag
119 ///
120 bool &playMusic() { return m_playMusic; }
121
122 /// @brief Callback invoked when game ends
123 std::function<void()> onGameOver;
124
125 private:
126 ///
127 /// @brief Subscribe to event bus events
128 /// @details Registers callbacks for world state updates and entity events
129 ///
130 void setupEventSubscriptions() const;
131
132 ///
133 /// @brief Process pending events from the event bus
134 /// @details Polls and handles network events from the event bus
135 ///
136 void processEventBus();
137
138 ///
139 /// @brief Handle world state update from server
140 /// @param event World state event containing entity data
141 /// @details Updates entity positions, creates/destroys entities as needed
142 ///
144
145 ///
146 /// @brief Preload commonly used textures
147 /// @details Loads textures into cache to avoid runtime loading hitches
148 ///
150
151 ///
152 /// @brief Update entity position interpolation
153 /// @param dataMap Map of entity ID to interpolation data
154 /// @param entityMap Map of entity ID to ECS entity
155 /// @param smoothFactor Interpolation smoothing factor (0.0-1.0)
156 /// @param dt Delta time for frame-rate independent interpolation
157 /// @param registry ECS registry containing entities
158 /// @details Smoothly interpolates entity positions between server updates
159 ///
160 void updateInterpolation(std::unordered_map<uint32_t, InterpolationData> &dataMap,
161 std::unordered_map<uint32_t, ecs::Entity> &entityMap, float smoothFactor, float dt,
162 ecs::Registry &registry);
163
164 ///
165 /// @brief Update entity position interpolation (const version)
166 /// @param dataMap Map of entity ID to interpolation data
167 /// @param entityMap Map of entity ID to ECS entity
168 /// @param smoothFactor Interpolation smoothing factor (0.0-1.0)
169 /// @param dt Delta time for frame-rate independent interpolation
170 /// @param registry ECS registry containing entities
171 ///
172 void updateInterpolation(std::unordered_map<uint32_t, InterpolationData> &dataMap,
173 std::unordered_map<uint32_t, ecs::Entity> &entityMap, float smoothFactor, float dt,
174 ecs::Registry &registry) const;
175
176 ecs::Entity m_localPlayerEntity; ///< Local player entity
177 std::unordered_map<uint32_t, ecs::Entity> m_remotePlayers; ///< Map of session ID to remote player entities
178
179 const std::shared_ptr<eng::IAudio> &m_audio; ///< Audio interface reference
180 const std::shared_ptr<eng::IRenderer> &m_renderer; ///< Renderer interface reference
181 float m_skinIndex; ///< Local player skin index
182 std::unique_ptr<PlayerControllerMulti> m_playerController; ///< Player input controller
183 std::unique_ptr<HUDSystem> m_hudSystem; ///< HUD rendering system
184 std::unordered_map<eng::Key, bool> m_keysPressed; ///< Current key press states
185 bool &m_showDebug; ///< Debug mode flag reference
186 bool m_playMusic = false; ///< Music playback flag
187
188 uint32_t m_sessionId; ///< Local player session ID
189 uint32_t m_eventComponentId = 10; ///< Event bus component ID
190 std::unique_ptr<StageManager> m_stageManager; ///< Stage/level manager
191
192 std::unordered_map<uint32_t, ecs::Entity> m_projectileEntities; ///< Map of projectile ID to entity
193 std::unordered_map<uint32_t, ecs::Entity> m_enemyEntities; ///< Map of enemy ID to entity
194
195 std::unordered_map<uint32_t, InterpolationData>
196 m_remotePlayerData; ///< Interpolation data for remote players
197 std::unordered_map<uint32_t, InterpolationData> m_projectileData; ///< Interpolation data for projectiles
198 std::unordered_map<uint32_t, InterpolationData> m_enemyData; ///< Interpolation data for enemies
199 std::unordered_map<uint32_t, uint32_t> m_playerSkinMap; ///< Map of player session ID to skin index
200 ///
201 /// @struct PendingInput
202 /// @brief Input command pending server acknowledgment
203 /// @details Used for client-side prediction and reconciliation
204 ///
206 {
207 uint32_t seqId; ///< Sequence ID of input
208 std::vector<uint8_t> inputData; ///< Serialized input data
209 float dt; ///< Delta time when input was sent
210 };
211 std::deque<PendingInput> m_inputHistory; ///< History of unacknowledged inputs
212 uint32_t m_lastAckSeqId = 0; ///< Last acknowledged input sequence ID
213
214 static constexpr float REMOTE_PLAYER_SMOOTH_FACTOR = 0.25f; ///< Interpolation speed for remote players
215 static constexpr float PROJECTILE_SMOOTH_FACTOR = 0.5f; ///< Interpolation speed for projectiles
216 static constexpr float ENEMY_SMOOTH_FACTOR = 0.18f; ///< Interpolation speed for enemies
217
218 bool m_starfieldCreated = false; ///< Flag indicating if starfield background was created
219 ecs::Entity m_beginSoundEntity{}; ///< Entity for game start sound
220 ecs::Entity m_bossMusicEntity{}; ///< Entity for boss music
221 float m_bossMusicTimer = 0.0f; ///< Timer for boss music duration
222 bool m_bossMusicStarted = false; ///< Flag indicating if boss music has started
223 static constexpr float BOSS_MUSIC_DURATION = 40.0f; ///< Duration of boss music in seconds
224
225 std::unordered_set<std::string> m_loadedTextures; ///< Cache of loaded texture paths
226 std::unordered_set<std::string> m_loadedFonts; ///< Cache of loaded font paths
227
228 bool m_firstWorldState = true; ///< Flag indicating if this is the first world state (for player skin init)
229 }; // class GameMulti
230} // namespace gme
Thread-safe event bus implementation for inter-component communication.
This file contains the Audio interface.
Heads-Up Display (HUD) system for R-Type multiplayer game.
Multiplayer player controller system for R-Type client.
Class for managing entities and their components.
Definition Registry.hpp:25
Abstract class for scene.
Definition IScene.hpp:52
Main multiplayer game scene handling networked gameplay.
Definition GameMulti.hpp:68
GameMulti & operator=(const GameMulti &other)=delete
Deleted copy assignment operator (non-copyable)
GameMulti(eng::id assignedId, const std::shared_ptr< eng::IRenderer > &renderer, const std::shared_ptr< eng::IAudio > &audio, float skinIndex, bool &showDebug, uint32_t sessionId)
Constructor.
Definition gameMulti.cpp:16
GameMulti(const GameMulti &other)=delete
Deleted copy constructor (non-copyable)
std::unordered_map< uint32_t, ecs::Entity > m_projectileEntities
Map of projectile ID to entity.
void processEventBus()
Process pending events from the event bus.
std::unique_ptr< PlayerControllerMulti > m_playerController
Player input controller.
uint32_t m_eventComponentId
Event bus component ID.
bool m_playMusic
Music playback flag.
bool m_firstWorldState
Flag indicating if this is the first world state (for player skin init)
std::unordered_map< uint32_t, ecs::Entity > m_enemyEntities
Map of enemy ID to entity.
float m_bossMusicTimer
Timer for boss music duration.
std::unordered_map< uint32_t, InterpolationData > m_projectileData
Interpolation data for projectiles.
~GameMulti() override=default
Destructor.
const std::shared_ptr< eng::IAudio > & m_audio
Audio interface reference.
std::unordered_map< eng::Key, bool > m_keysPressed
Current key press states.
void event(const eng::Event &event) override
Handle input events.
void updatePlayerSkin()
Update the local player's visual skin/appearance.
void update(float dt, const eng::WindowSize &size) override
Update the game scene (called each frame)
ecs::Entity m_bossMusicEntity
Entity for boss music.
static constexpr float PROJECTILE_SMOOTH_FACTOR
Interpolation speed for projectiles.
std::unordered_set< std::string > m_loadedFonts
Cache of loaded font paths.
static constexpr float ENEMY_SMOOTH_FACTOR
Interpolation speed for enemies.
void handleWorldStateUpdate(const utl::Event &event)
Handle world state update from server.
bool m_bossMusicStarted
Flag indicating if boss music has started.
static constexpr float BOSS_MUSIC_DURATION
Duration of boss music in seconds.
bool & m_showDebug
Debug mode flag reference.
void preloadCommonTextures()
Preload commonly used textures.
GameMulti(GameMulti &&other)=delete
Deleted move constructor (non-movable)
std::unordered_set< std::string > m_loadedTextures
Cache of loaded texture paths.
std::unique_ptr< StageManager > m_stageManager
Stage/level manager.
std::function< void()> onGameOver
Callback invoked when game ends.
ecs::Entity m_beginSoundEntity
Entity for game start sound.
bool & playMusic()
Get reference to music playback flag.
std::unordered_map< uint32_t, ecs::Entity > m_remotePlayers
Map of session ID to remote player entities.
void updateInterpolation(std::unordered_map< uint32_t, InterpolationData > &dataMap, std::unordered_map< uint32_t, ecs::Entity > &entityMap, float smoothFactor, float dt, ecs::Registry &registry)
Update entity position interpolation.
std::unordered_map< uint32_t, InterpolationData > m_enemyData
Interpolation data for enemies.
void updateInterpolation(std::unordered_map< uint32_t, InterpolationData > &dataMap, std::unordered_map< uint32_t, ecs::Entity > &entityMap, float smoothFactor, float dt, ecs::Registry &registry) const
Update entity position interpolation (const version)
uint32_t m_lastAckSeqId
Last acknowledged input sequence ID.
std::unordered_map< uint32_t, uint32_t > m_playerSkinMap
Map of player session ID to skin index.
bool m_starfieldCreated
Flag indicating if starfield background was created.
ecs::Entity m_localPlayerEntity
Local player entity.
void setupEventSubscriptions() const
Subscribe to event bus events.
float m_skinIndex
Local player skin index.
const std::shared_ptr< eng::IRenderer > & m_renderer
Renderer interface reference.
std::unordered_map< uint32_t, InterpolationData > m_remotePlayerData
Interpolation data for remote players.
GameMulti & operator=(GameMulti &&other)=delete
Deleted move assignment operator (non-movable)
static constexpr float REMOTE_PLAYER_SMOOTH_FACTOR
Interpolation speed for remote players.
std::unique_ptr< HUDSystem > m_hudSystem
HUD rendering system.
uint32_t m_sessionId
Local player session ID.
std::deque< PendingInput > m_inputHistory
History of unacknowledged inputs.
Event structure for inter-component communication.
Definition Event.hpp:89
This file contains the IScene class.
std::uint32_t Entity
Definition Entity.hpp:13
unsigned int id
Definition IScene.hpp:20
Input command pending server acknowledgment.
float dt
Delta time when input was sent.
uint32_t seqId
Sequence ID of input.
std::vector< uint8_t > inputData
Serialized input data.
Data structure for entity position interpolation.
Definition GameMulti.hpp:39
float targetVy
Target velocity from server.
Definition GameMulti.hpp:41
float currentRotation
Current interpolated rotation.
Definition GameMulti.hpp:45
float currentY
Current interpolated position.
Definition GameMulti.hpp:42
float targetY
Target position from server update.
Definition GameMulti.hpp:40
float targetRotation
Target rotation angle.
Definition GameMulti.hpp:44
float smoothFactor
Interpolation smoothing factor (0.0-1.0)
Definition GameMulti.hpp:43