summaryrefslogtreecommitdiff
path: root/in_practice/breakout/ball.c
blob: 1ec502e7606332512ee9697b2ba3526826b646a4 (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
#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;
}