summary refs log tree commit diff stats
path: root/src/components.h
blob: c66db47bcb81e533f6028937f7fcd828ff8b620e (plain) (blame)
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
#ifndef COMPONENTS_H
#define COMPONENTS_H

#include "entity.h"
#include <utility>
#include <list>
#include "map.h"
#include <memory>

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;
};

#endif