1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
#ifndef COMPONENTS_H
#define COMPONENTS_H
#include <utility>
#include <list>
#include "renderer.h"
#include "entity.h"
#include "game.h"
class Map;
class UserMovementComponent : public Component {
public:
void input(Game& game, Entity& entity, int key, int action);
private:
bool holdingLeft = false;
bool holdingRight = false;
};
class PhysicsBodyComponent : public Component {
public:
void receive(Game& game, Entity& entity, const Message& msg);
void tick(Game& game, Entity& entity, double dt);
void detectCollision(Game& game, Entity& entity, Entity& collider, std::pair<double, double> old_position);
protected:
std::pair<double, double> velocity;
std::pair<double, double> accel;
};
class PlayerSpriteComponent : public Component {
public:
void render(Game& game, Entity& entity, Texture& buffer);
void receive(Game& game, Entity& entity, const Message& msg);
private:
Texture sprite {"../res/Starla.png"};
int animFrame = 0;
bool facingLeft = false;
bool isMoving = false;
bool dying = false;
};
class PlayerPhysicsComponent : public PhysicsBodyComponent {
public:
PlayerPhysicsComponent();
void tick(Game& game, Entity& entity, double dt);
void receive(Game& game, Entity& entity, const Message& msg);
private:
double jump_velocity;
double jump_gravity;
double jump_gravity_short;
int direction = 0;
bool canDrop = false;
bool frozen = false;
};
class MapRenderComponent : public Component {
public:
MapRenderComponent(const Map& map);
void render(Game& game, Entity& entity, Texture& buffer);
private:
Texture screen{GAME_WIDTH, GAME_HEIGHT};
};
class MapCollisionComponent : public Component {
public:
MapCollisionComponent(const Map& map);
void detectCollision(Game& game, Entity& entity, Entity& collider, std::pair<double, double> old_position);
private:
enum class Direction {
up, left, down, right
};
struct Collision {
enum class Type {
wall,
wrap,
teleport,
reverse,
platform,
danger
};
int axis;
int lower;
int upper;
Type type;
};
void addCollision(int axis, int lower, int upper, Direction dir, Collision::Type type);
bool processCollision(Game& game, Entity& collider, Collision collision, Direction dir);
std::list<Collision> left_collisions;
std::list<Collision> right_collisions;
std::list<Collision> up_collisions;
std::list<Collision> down_collisions;
const Map& map;
};
class StaticImageComponent : public Component {
public:
StaticImageComponent(const char* filename);
void render(Game& game, Entity& entity, Texture& buffer);
private:
Texture sprite;
};
class SimpleColliderComponent : public Component {
public:
SimpleColliderComponent(std::function<void (Game& game, Entity& collider)> callback);
void receive(Game& game, Entity& entity, const Message& msg);
private:
std::function<void (Game& game, Entity& collider)> callback;
};
#endif
|