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
|
#include "ball.h"
void move_ball(struct ball *ball, f32 dt, i32 width)
{
if (ball->stuck)
return;
ball->o.pos = add_v2(ball->o.pos, scale_v2(ball->o.vel, dt));
if (ball->o.pos.x < 0.0f) {
ball->o.vel.x = -ball->o.vel.x;
ball->o.pos.x = 0.0f;
}
if (ball->o.pos.x + ball->o.size.x > width) {
ball->o.vel.x = -ball->o.vel.x;
ball->o.pos.x = width - ball->o.size.x;
}
if (ball->o.pos.y < 0.0f) {
ball->o.vel.y = -ball->o.vel.y;
ball->o.pos.y = 0.0f;
}
}
struct collision check_ball_collision(struct ball ball, struct object obj)
{
v2 ball_center = add_v2(ball.o.pos, v2a(ball.radius));
v2 obj_half_size = scale_v2(obj.size, 0.5f);
v2 obj_center = add_v2(obj.pos, obj_half_size);
v2 diff = sub_v2(ball_center, obj_center);
v2 clamped = clamp_v2(diff, scale_v2(obj_half_size, -1.0f), obj_half_size);
v2 closest = add_v2(obj_center, clamped);
diff = sub_v2(closest, ball_center);
struct collision collision = {0};
if (length_v2(diff) <= ball.radius)
collision = (struct collision){1, direction_v2(diff), diff};
return collision;
}
|