summaryrefslogtreecommitdiff
path: root/src/physics.c
blob: 6781c41ae8b12db83065bfab2c894c4e49c29c3a (plain)
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
#include "physics.h"
#include "game.h"
#include "utils.h"

extern Game game;

void MoveAndStop(Entity* e, float deltaTime) {
    Vector2 velocity = e->velocity;
    Rectangle physicsCollider = GetPhysicsColliderGlobal(e);
    Rectangle pastCollider = physicsCollider;

    physicsCollider.x += e->velocity.x * deltaTime;
    for (int i = 0; i < MAX_ENTITY_COUNT; i++) {
        Entity* other = &game.entities[i];

        if(!PhysicsEnabled(other) || SameEntity(other, e)) continue;
        Rectangle otherCollider = GetPhysicsColliderGlobal(other);

        if(CheckCollisionRecs(physicsCollider, otherCollider)) {
            if (velocity.x > 0) {
                physicsCollider.x = otherCollider.x - physicsCollider.width;
            } else {
                physicsCollider.x = otherCollider.x + otherCollider.width;
            }
        }
    }

    physicsCollider.y += e->velocity.y * deltaTime;
    for (int i = 0; i < MAX_ENTITY_COUNT; i++) {
        Entity* other = &game.entities[i];

        if(!PhysicsEnabled(other) || SameEntity(other, e)) continue;

        Rectangle otherCollider = GetPhysicsColliderGlobal(other);

        if(CheckCollisionRecs(physicsCollider, otherCollider)) {
            if (velocity.y > 0) {
                physicsCollider.y = otherCollider.y - physicsCollider.height;
            } else {
                physicsCollider.y = otherCollider.y + otherCollider.height;
            }
        }
    }

    e->position.x += (physicsCollider.x - pastCollider.x);
    e->position.y += (physicsCollider.y - pastCollider.y);
}

#ifdef BEATEMUP_DEBUG
void DebugHighlights(const Entity* e) {
    if (!PhysicsEnabled(e))
        return;

    Rectangle dstRect = GetPhysicsColliderGlobal(e);

    Color colliderDrawColor = e->physicsColliderColor;
    colliderDrawColor.a = 170;

    DrawRectangle(dstRect.x, dstRect.y, dstRect.width, dstRect.height, colliderDrawColor);
}
#endif