Olympe Engine 2.0
2D Game Engine with ECS Architecture
Loading...
Searching...
No Matches
CameraEventHandler.cpp
Go to the documentation of this file.
1/*
2Olympe Engine V2 - 2025
3Nicolas Chereau
4nchereau@gmail.com
5
6This file is part of Olympe Engine V2.
7
8CameraEventHandler Implementation: Handles camera events and provides
9convenient API for camera control.
10
11*/
12
13#include "CameraEventHandler.h"
14#include "EventQueue.h"
15#include "system_utils.h"
16#include "../World.h"
17
18
19//-------------------------------------------------------------
21{
22 if (m_initialized)
23 return;
24
25 // Note: EventManager removed - camera events now handled by CameraEventConsumeSystem
26
27 m_initialized = true;
28 SYSTEM_LOG << "CameraEventHandler initialized (legacy)\n";
29}
30
31//-------------------------------------------------------------
33{
34 if (!m_initialized)
35 return;
36
37 // Unregister from all events (legacy - no longer needed)
38
39 m_initialized = false;
40 SYSTEM_LOG << "CameraEventHandler shut down\n";
41}
42
43//-------------------------------------------------------------
82
83//-------------------------------------------------------------
84// Public API implementations
85//-------------------------------------------------------------
86
88{
93 -1
94 );
95 msg.param1 = intensity;
96 msg.param2 = duration;
97
99}
100
101//-------------------------------------------------------------
113
114//-------------------------------------------------------------
115void CameraEventHandler::TeleportCamera(short playerID, float x, float y)
116{
120 playerID,
121 -1
122 );
123 msg.param1 = x;
124 msg.param2 = y;
125
127}
128
129//-------------------------------------------------------------
130void CameraEventHandler::ZoomCameraTo(short playerID, float targetZoom, float speed)
131{
135 playerID,
136 -1
137 );
138 msg.param1 = targetZoom;
139 msg.param2 = speed;
140
142}
143
144//-------------------------------------------------------------
145void CameraEventHandler::RotateCameraTo(short playerID, float targetRotation, float speed)
146{
150 playerID,
151 -1
152 );
153 msg.param1 = targetRotation;
154 msg.param2 = speed;
155
157}
158
159//-------------------------------------------------------------
171
172//-------------------------------------------------------------
174{
175 // Note: SDL_FRect cannot be passed directly through Message
176 // We'll need to handle this through direct system access
178 if (!camSys)
179 return;
180
183 return;
184
186 return;
187
189 boundsData.useBounds = true;
190 boundsData.boundingBox = bounds;
191}
192
193//-------------------------------------------------------------
205
206//-------------------------------------------------------------
208{
210 if (!camSys)
211 return;
212
215 return;
216
217 camSys->SetCameraTarget_ECS(cameraEntity, targetEntity);
218}
219
220//-------------------------------------------------------------
232
233//-------------------------------------------------------------
234// Event handlers
235//-------------------------------------------------------------
236
238{
239 short playerID = (short)msg.deviceId;
240 float intensity = msg.param1;
241 float duration = msg.param2;
242
244 if (!camSys)
245 return;
246
249 return;
250
252 return;
253
255 effects.isShaking = true;
256 effects.shakeIntensity = intensity;
257 effects.shakeDuration = duration;
258 effects.shakeTimeRemaining = duration;
259}
260
261//-------------------------------------------------------------
263{
264 short playerID = (short)msg.deviceId;
265
267 if (!camSys)
268 return;
269
272 return;
273
275 return;
276
278 effects.isShaking = false;
279 effects.shakeTimeRemaining = 0.0f;
280 effects.shakeOffset = Vector(0.f, 0.f, 0.f);
281}
282
283//-------------------------------------------------------------
285{
286 short playerID = (short)msg.deviceId;
287 float x = msg.param1;
288 float y = msg.param2;
289
291 if (!camSys)
292 return;
293
296 return;
297
299 return;
300
302 cam.position = Vector(x, y, 0.f);
303}
304
305//-------------------------------------------------------------
307{
308 short playerID = (short)msg.deviceId;
309 float targetZoom = msg.param1;
310 float speed = msg.param2;
311
313 if (!camSys)
314 return;
315
318 return;
319
321 return;
322
324 cam.targetZoom = targetZoom;
325
326 if (speed > 0.0f)
327 {
328 cam.zoomSpeed = speed;
329 }
330 else
331 {
332 // Instant zoom if speed is 0 or negative
333 cam.zoom = targetZoom;
334 }
335}
336
337//-------------------------------------------------------------
339{
340 short playerID = (short)msg.deviceId;
341 float targetRotation = msg.param1;
342 float speed = msg.param2;
343
345 if (!camSys)
346 return;
347
350 return;
351
353 return;
354
356 cam.targetRotation = targetRotation;
357
358 if (speed > 0.0f)
359 {
360 cam.rotationSpeed = speed;
361 }
362 else
363 {
364 // Instant rotation if speed is 0 or negative
365 cam.rotation = targetRotation;
366 }
367}
368
369//-------------------------------------------------------------
371{
372 short playerID = (short)msg.deviceId;
373
375 if (!camSys)
376 return;
377
380 return;
381
383 return;
384
386 cam.controlOffset = Vector(0.f, 0.f, 0.f);
387 cam.targetZoom = 1.0f;
388 cam.zoom = 1.0f;
389 cam.targetRotation = 0.0f;
390 cam.rotation = 0.0f;
391}
392
393//-------------------------------------------------------------
395{
396 // This is handled directly in SetCameraBounds API method
397 // since SDL_FRect cannot be passed through Message
398}
399
400//-------------------------------------------------------------
419
420//-------------------------------------------------------------
422{
423 // This is handled directly in FollowTarget API methods
424 // since EntityID and GameObject* cannot be passed through Message easily
425}
426
427//-------------------------------------------------------------
429{
430 short playerID = (short)msg.deviceId;
431
433 if (!camSys)
434 return;
435
438 return;
439
440 camSys->ClearCameraTarget(cameraEntity);
441}
ComponentTypeID GetComponentTypeID_Static()
Definition ECS_Entity.h:56
std::uint64_t EntityID
Definition ECS_Entity.h:21
const EntityID INVALID_ENTITY_ID
Definition ECS_Entity.h:23
void HandleUnfollowEvent(const Message &msg)
void HandleTeleportEvent(const Message &msg)
void HandleBoundsEvent(const Message &msg)
void RotateCameraTo(short playerID, float targetRotation, float speed)
void ZoomCameraTo(short playerID, float targetZoom, float speed)
void HandleFollowEvent(const Message &msg)
void StopCameraShake(short playerID)
void HandleZoomEvent(const Message &msg)
void HandleResetEvent(const Message &msg)
void ClearCameraBounds(short playerID)
virtual void OnEvent(const Message &msg) override
void HandleShakeStopEvent(const Message &msg)
void UnfollowTarget(short playerID)
void SetCameraBounds(short playerID, const SDL_FRect &bounds)
void FollowTarget(short playerID, EntityID targetEntity)
void TeleportCamera(short playerID, float x, float y)
void ResetCamera(short playerID)
void HandleClearBoundsEvent(const Message &msg)
void HandleRotateEvent(const Message &msg)
void TriggerCameraShake(short playerID, float intensity, float duration)
void HandleShakeEvent(const Message &msg)
EntityID GetCameraEntityForPlayer(short playerID)
void Push(const Message &msg)
Definition EventQueue.h:37
static EventQueue & Get()
Definition EventQueue.h:34
static World & Get()
Get singleton instance (short form)
Definition World.h:232
bool HasComponent(EntityID entity) const
Definition World.h:451
T * GetSystem()
Definition World.h:244
T & GetComponent(EntityID entity)
Definition World.h:438
Vector controlOffset
static Message Create(EventType _ev_t, EventDomain _domain, int _d_id=-1, int _c_id=-1, uint64_t _t_uid=0)
Definition message.h:28
@ Olympe_EventType_Camera_SetBounds
@ Olympe_EventType_Camera_ClearBounds
@ Olympe_EventType_Camera_RotateTo
@ Olympe_EventType_Camera_Teleport
@ Olympe_EventType_Camera_ZoomTo
@ Olympe_EventType_Camera_Reset
@ Olympe_EventType_Camera_Target_Unfollow
@ Olympe_EventType_Camera_Target_Follow
@ Olympe_EventType_Camera_Shake_Stop
@ Olympe_EventType_Camera_Shake
#define SYSTEM_LOG