Вам нужно понять, что такое нормаль, чтобы рассчитать вектор отражения при столкновении. К счастью, это не очень сложно понять. Что касается математики, я буду немного неточен, поэтому, пожалуйста, не бейте меня за это. :)
Нормаль - это просто единичный вектор (единица измерения: = 1), который ортогонален (под углом 90 градусов) к поверхности. Вы можете визуализировать нормаль как стрелку, торчащую прямо из поверхности. Поскольку ваши стены не наклонены, вычислить для них нормальные значения легко (при условии, что верхний левый угол экрана равен 0,0):
top: (0,1)
bottom: (0,-1)
left: (1,0)
right: (-1,0)
То, что нам нужно сделать, это измерить скорость вашего шара и «отразить» ее вдоль вектора нормали для стены, которую вы ударили. Формула для отражения следующая:
V2 = V1 - 2*N*(N.dot(V1))
Где V1 - ваш падающий вектор (в данном случае ваша старая скорость), N - нормаль для стены, которую мы ударили, а V2 - ваш отраженный вектор (ваша новая скорость). «N.dot (V1)» является «точечным произведением» N и V1, которое просто (N.x V1.x + N.y V1.y).
Изображение из Википедии о том, что мы делаем (P - вектор инцидента, Q - отраженный вектор):
Вот все это в psuedocode:
float nx = 0, ny = 1; // replace these with the normal of the wall you hit
float ix = ball.vx, iy = ball.vy; // incident vector
float dotprod = (nx*ix + ny*iy); // the dot product i mentioned earlier
ball.vx = ix - 2*nx*(dotprod);
ball.vy = iy - 2*ny*(dotprod);
Дайте мне знать, если что-то неясно. :) Кроме того, несмотря на то, что это своего рода перебор для стен, вам нужно будет вычислять нормальное значение при столкновении шарика с шариком, так что это не полная трата ...