Столкновение мячей: шарики слипаются - PullRequest
10 голосов
/ 20 июня 2011

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

Однако иногда мои шары могут слипаться (перекрываться).Та же ситуация не произошла в примере.Зачем?Нужно ли начинать тему для каждого шара?

Ответы [ 2 ]

1 голос
/ 20 июня 2011

Эта проблема возникает, когда два шара сталкиваются с достаточной скоростью, чтобы они не могли полностью разделиться в последующем цикле действий. Я обнаружил, что лучший способ справиться с этим - нормализовать расстояние между ними до (r1 + r2), где r - радиус шара при каждом столкновении. Это гарантирует, что они будут разделяться в последующем цикле действий, но у них есть потенциал для создания дополнительных столкновений, если в очень узком пространстве много шариков.

1 голос
/ 20 июня 2011

Вероятно, это

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
...