Calamity Engine 1.0.0
A cross-platform 2D game engine written in C++ and SDL3.
Loading...
Searching...
No Matches
components.hpp
Go to the documentation of this file.
1#pragma once
2#include "../definitions.hpp"
3#include "../../services/services.hpp"
4#include "../../services/input/keycode.hpp"
5#include "../../services/input/input.hpp"
6#include "../ui/definitions.hpp"
8#include <cereal/types/map.hpp>
9#include <cereal/types/vector.hpp>
10#include <cereal/types/string.hpp>
11
12class Node; // Forward declaration'
13
21{
22 virtual ~Component() = default;
23 virtual void update(float deltaTime) {};
24 virtual void render(std::shared_ptr<Window> window) {};
25 virtual void initialize() {};
26 virtual void physicsUpdate() {};
27 virtual void input(InputEvent &event) {};
28 virtual void postLoad() {};
29 virtual void exit() {};
30
31 Node *getNode() const;
32 void setNode(Node *n);
33
34 template <class Archive>
35 void save(Archive &ar) const {}
36
37 template <class Archive>
38 void load(Archive &ar) {}
39
40private:
41 Node *node;
42};
43
95class Sprite : public Component
96{
97public:
99 explicit Sprite(const std::string &texturePath, std::shared_ptr<Window> window, TextureScaling scaling = TextureScaling::NEAREST);
100
101 void postLoad() override;
102 void render(std::shared_ptr<Window>) override;
103 void initialize() override;
104
105 Vector2 origin = {0.5f, 0.5f};
107
109 bool visible = true;
110 // int zIndex = 1;
111 bool screenSpace = false;
113
114 bool flipH = false;
115 bool flipV = false;
116
117 template <class Archive>
118 void save(Archive &ar) const
119 {
120 ar(CEREAL_NVP(origin), CEREAL_NVP(sourceRect), CEREAL_NVP(visible), CEREAL_NVP(texture), CEREAL_NVP(screenSpace), CEREAL_NVP(modulate), CEREAL_NVP(flipH), CEREAL_NVP(flipV));
121 }
122
123 template <class Archive>
124 void load(Archive &ar)
125 {
126 std::cout << "LOADING SPRITE" << std::endl;
127 ar(CEREAL_NVP(origin), CEREAL_NVP(sourceRect), CEREAL_NVP(visible), CEREAL_NVP(texture), CEREAL_NVP(screenSpace), CEREAL_NVP(modulate), CEREAL_NVP(flipH), CEREAL_NVP(flipV));
128 }
129};
130
195{
196public:
197 AnimatedSprite() = default;
198 AnimatedSprite(std::shared_ptr<Window> window) : window(window) {};
199
200 void initialize() override;
201 void render(std::shared_ptr<Window>) override;
202 void update(float deltaTime) override;
203
204 void addAnimation(const Animation &animation);
205 void removeAnimation(const std::string &name);
206
207 void play(const std::string &animation);
208 void stop();
209 void pause();
210
216
217 bool flipH = false;
218 bool flipV = false;
219
220 const Texture *getCurrentTexture() const;
221 Vector2 getCurrentSize() const;
222 bool isPlaying() const;
223 Frame *getCurrentFrame() const;
224
225 std::string getCurrentAnimationName() const;
227
228 std::map<std::string, Animation> animations;
229 bool visible = true;
230 // int zIndex = 1; I'm not implementing this rn
231 bool screenSpace = false;
232
233 template <class Archive>
234 void save(Archive &ar) const
235 {
236 std::string currentAnimName = currentAnimation ? currentAnimation->name : std::string("");
237 ar(CEREAL_NVP(animations), CEREAL_NVP(visible), CEREAL_NVP(screenSpace),
238 CEREAL_NVP(frame), CEREAL_NVP(playing), currentAnimName);
239 }
240
241 template <class Archive>
242 void load(Archive &ar)
243 {
244 std::string currentAnimName;
245 ar(CEREAL_NVP(animations), CEREAL_NVP(visible), CEREAL_NVP(screenSpace),
246 CEREAL_NVP(frame), CEREAL_NVP(playing), currentAnimName);
247
248 saveCurrentAnimName = currentAnimName;
249 }
250
251 void postLoad();
252private:
253 float elapsed = 0.0f;
254 int frame = 0;
255 std::unique_ptr<Animation> currentAnimation = nullptr;
256
257 std::string saveCurrentAnimName;
258 Texture currentTexture;
259 bool playing = false;
260 std::shared_ptr<Window> window = nullptr;
261};
262
288class Tilemap : public Component
289{
290public:
291 Tilemap() = default;
292 Tilemap(const std::string &texturePath, Vector2 tileSize, std::shared_ptr<Window> window, TextureScaling scaling = TextureScaling::PIXELART);
293
294 bool visible = true;
297 std::vector<Tile> tiles;
298
299 // sdl bullshit
300 std::vector<SDL_Vertex> vertexBuffer;
301 std::vector<int> indexBuffer;
302
303 int addTile(const Tile &tile);
304 void removeTile(int index);
305
306 template <typename... Args>
307 void addTiles(Args... tiles)
308 {
309 (this->tiles.push_back(tiles), ...);
310 dirty = true;
311 }
312
313 void update();
314 void render(std::shared_ptr<Window>) override;
315 void initialize() { bake(); };
316 void bake();
317
318 template <class Archive>
319 void save(Archive &ar) const
320 {
321 ar(CEREAL_NVP(visible), CEREAL_NVP(texture), CEREAL_NVP(tileSize), CEREAL_NVP(tiles));
322 }
323
324 template <class Archive>
325 void load(Archive &ar)
326 {
327 ar(CEREAL_NVP(visible), CEREAL_NVP(texture), CEREAL_NVP(tileSize), CEREAL_NVP(tiles));
328 bake();
329 }
330
331private:
332 bool dirty = false;
333};
334
386class Script : public Component
387{
388public:
389 virtual void update(float deltaTime) {};
390 virtual void initialize() {};
391 virtual void physicsUpdate() {};
392 virtual void render(std::shared_ptr<Window> window) {};
393 virtual void exit() {};
394
395 template <class Archive>
396 void save(Archive &ar) const {};
397
398 template <class Archive>
399 void load(Archive &ar) {};
400};
401
426class Camera : public Component
427{
428public:
429 void setActive();
430 bool active = true;
431 Vector2 origin = {0.5f, 0.5f};
432 float smoothing = 0.0f;
433
434 void update(float deltaTime) override;
435 void initialize() override;
436
439 Vector2 screenToWorld(Vector2 screen) const;
440
441 template <class Archive>
442 void save(Archive &ar) const
443 {
444 ar(CEREAL_NVP(active), CEREAL_NVP(origin));
445 }
446
447 template <class Archive>
448 void load(Archive &ar)
449 {
450 ar(CEREAL_NVP(active), CEREAL_NVP(origin));
451 }
452
453private:
454 Vector2 globalPos = Vector2{0.0f, 0.0f};
455};
Definition components.hpp:195
Signal< std::string > stopped
Definition components.hpp:214
void save(Archive &ar) const
Definition components.hpp:234
Signal< std::string > paused
Definition components.hpp:215
Signal< std::string > changed
Definition components.hpp:211
void initialize() override
Definition components.cpp:120
const Texture * getCurrentTexture() const
Definition components.cpp:100
std::string getCurrentAnimationName() const
Definition components.cpp:204
void postLoad()
Definition components.cpp:111
void pause()
Definition components.cpp:175
Signal< std::string > looped
Definition components.hpp:213
bool isPlaying() const
Definition components.cpp:245
Vector2 getCurrentSize() const
Definition components.cpp:197
void addAnimation(const Animation &animation)
Definition components.cpp:139
Animation * getCurrentAnimation() const
Definition components.cpp:211
void removeAnimation(const std::string &name)
Definition components.cpp:144
Signal< std::string > finished
Definition components.hpp:212
bool flipH
Definition components.hpp:217
bool screenSpace
Definition components.hpp:231
void load(Archive &ar)
Definition components.hpp:242
Frame * getCurrentFrame() const
Definition components.cpp:190
void update(float deltaTime) override
Definition components.cpp:218
AnimatedSprite(std::shared_ptr< Window > window)
Definition components.hpp:198
bool visible
Definition components.hpp:229
AnimatedSprite()=default
void play(const std::string &animation)
Definition components.cpp:149
void render(std::shared_ptr< Window >) override
Definition components.cpp:107
std::map< std::string, Animation > animations
Definition components.hpp:228
bool flipV
Definition components.hpp:218
void stop()
Definition components.cpp:181
Definition definitions.hpp:372
Definition components.hpp:427
void initialize() override
Definition components.cpp:28
void load(Archive &ar)
Definition components.hpp:448
void update(float deltaTime) override
Definition components.cpp:36
Vector2 origin
Definition components.hpp:431
void save(Archive &ar) const
Definition components.hpp:442
Transform getCameraTransform() const
Definition components.cpp:50
float smoothing
Definition components.hpp:432
bool active
Definition components.hpp:430
Vector2 screenToWorld(Vector2 screen) const
Definition components.cpp:62
Vector2 getGlobalPosition()
Definition components.cpp:57
void setActive()
Definition components.cpp:22
Definition definitions.hpp:41
static const Color WHITE
Definition definitions.hpp:58
Definition input.hpp:62
Definition node.hpp:31
Definition components.hpp:387
virtual void initialize()
Definition components.hpp:390
virtual void physicsUpdate()
Definition components.hpp:391
void save(Archive &ar) const
Definition components.hpp:396
virtual void update(float deltaTime)
Definition components.hpp:389
virtual void render(std::shared_ptr< Window > window)
Definition components.hpp:392
void load(Archive &ar)
Definition components.hpp:399
virtual void exit()
Definition components.hpp:393
Definition signal.hpp:53
Definition components.hpp:96
void postLoad() override
Definition components.cpp:92
bool flipH
Definition components.hpp:114
void load(Archive &ar)
Definition components.hpp:124
Color modulate
Definition components.hpp:112
Rect sourceRect
Definition components.hpp:108
bool screenSpace
Definition components.hpp:111
Texture texture
Definition components.hpp:106
void initialize() override
Definition components.cpp:84
Vector2 origin
Definition components.hpp:105
bool visible
Definition components.hpp:109
void render(std::shared_ptr< Window >) override
Definition components.cpp:80
void save(Archive &ar) const
Definition components.hpp:118
bool flipV
Definition components.hpp:115
Definition definitions.hpp:154
Definition components.hpp:289
Tilemap()=default
bool visible
Definition components.hpp:294
void addTiles(Args... tiles)
Definition components.hpp:307
void save(Archive &ar) const
Definition components.hpp:319
std::vector< int > indexBuffer
Definition components.hpp:301
void removeTile(int index)
Definition components.cpp:308
void load(Archive &ar)
Definition components.hpp:325
void initialize()
Definition components.hpp:315
Texture texture
Definition components.hpp:295
std::vector< SDL_Vertex > vertexBuffer
Definition components.hpp:300
void bake()
Definition components.cpp:262
int addTile(const Tile &tile)
Definition components.cpp:301
std::vector< Tile > tiles
Definition components.hpp:297
Vector2 tileSize
Definition components.hpp:296
void render(std::shared_ptr< Window >) override
Definition components.cpp:252
void update()
Definition components.cpp:295
TextureScaling
Definition definitions.hpp:122
Definition components.hpp:21
void save(Archive &ar) const
Definition components.hpp:35
virtual void update(float deltaTime)
Definition components.hpp:23
virtual void physicsUpdate()
Definition components.hpp:26
void setNode(Node *n)
Definition components.cpp:16
virtual void exit()
Definition components.hpp:29
virtual void initialize()
Definition components.hpp:25
virtual void render(std::shared_ptr< Window > window)
Definition components.hpp:24
virtual void postLoad()
Definition components.hpp:28
Node * getNode() const
Definition components.cpp:11
void load(Archive &ar)
Definition components.hpp:38
virtual void input(InputEvent &event)
Definition components.hpp:27
virtual ~Component()=default
Definition definitions.hpp:324
Definition definitions.hpp:294
Definition definitions.hpp:509
Definition definitions.hpp:259
Definition definitions.hpp:77