Вам нужно будет понять, что такое нормаль, чтобы рассчитать вектор отражения при столкновении. К счастью, это не очень сложно понять. Для любителей математики я буду немного неточен, поэтому, пожалуйста, не бейте меня за это. :)
Нормаль — это просто единичный вектор (единица измерения: величина = 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.xV1.x + N.yV1.y).
Картинка из Википедии того, что мы делаем (P — вектор падения, Q — вектор отражения):
Вот все это в псевдокоде:
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);
Дайте мне знать, если что-то неясно. :) Кроме того, хотя для стен это излишество, вам нужно будет вычислить нормаль при столкновении мяча с мячом, так что это не пустая трата времени...
person
Faisal
schedule
11.07.2010