Столкновение с мячом: шары падают вместе
Я последовал примеру http://www.emanueleferonato.com/2007/08/19/managing-ball-vs-ball-collision-with-flash/, чтобы создать шаровую коллизию на Android,
мой код был организован следующим образом:
int N = 6; // number of balls
for (int i=0; i<N; i++) {
// move ball
// as in line 10~39
// collision detection
for(int j=i+1; j<N; j++) {
// as in line 66~77
} // end for
} // end for
Однако иногда мои яйца могут склеиваться (перекрываться).
Такая же ситуация не была в этом примере.
Почему?
Нужно ли начинать нить для каждого шара?
Ответы
Ответ 1
Эта проблема возникает, когда два шара сталкиваются с достаточной скоростью, которые они не могут полностью разделить на последующий цикл действия. Я нашел лучший способ справиться с этим - это нормализовать расстояние между ними до (r1 + r2), где r - радиус шара всякий раз, когда обнаруживается столкновение. Это гарантирует, что они будут разделены на последующий цикл действий, но имеет некоторый потенциал для возникновения дополнительных столкновений, если в очень плотном пространстве много шаров.
Ответ 2
Вероятно, это
ball.xspeed = Math.random()*8-4;
ball.yspeed = Math.random()*8-4;
Они генерируют xspeed и yspeeds с плавающей запятой. Значения округления /float/ceil используются для рисования на экране. Я думаю, что, когда запускается процедура обнаружения столкновений и проверяет наличие столкновения, она не может найти ее, когда шары находятся на очень небольшом расстоянии друг от друга в расчете, но когда скорость намного выше, следующий шаг подтолкнет шары к их границам. Когда они находятся внутри друг друга, function manage_bounce(ball, ball2)
будет вызываться при каждом приращении и попытаться настроить направление отката, но только для поиска другого столкновения.
Я думаю, что основная проблема заключается в большом приращении в скоординированном из-за большого значения скорости, но на небольшом расстоянии между двумя шарами, которые толкают их друг в друга, чем вычисления с плавающей запятой.
Во время вычисления, когда вы обнаружили столкновение, вы должны убедиться в том, что они не находятся внутри друг друга, и если да, то выньте их и переместите. ИЛИ вы можете подумать о приращении скорости, если два шара будут больше пикселей, чем добавленное расстояние, или что-то вроде этого
if the balls are `dn` pixels apart
if the speed in direction `n` is `n_speed`
then
if `dn` < `n_speed`
`n = n + dn`
else
`n = n + n_speed`
endif
endif
endif