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