Столкновение с мячом: шары падают вместе

Я последовал примеру 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