Мы постоянно работаем над игрой Breakout для школы. Вот как мы это делаем. Обратите внимание, что это из класса Ball, поэтому каждый раз, когда вы видите это, думайте Ball.
Следующий метод Bounce вычисляет и применяет изменение скорости и вращения в результате отскока мяча.
«Коэффициенты» указывают, как преобразовать скорости в направлениях x и y в скорость, параллельную поверхности. Если мы сориентируем наш взгляд так, что мяч движется вниз к поверхности, скорость, параллельная поверхности, положительна, если движение идет вправо.
Уравнения получены из физического анализа, представленного в: Ричард Л. Гарвин, "Кинематика ультраупругого шероховатого мяча", Американский журнал физики, 37, 88-92, январь 1969 г. Это определяет поведение идеально прыгающего мяча (упругого столкновение) с вращением, которое не скользит/скользит при отскоке. Реальным аналогом является продукт Superball от Wham-O.
Делаем две модификации/специализации: 1) Так как мы работаем в двух измерениях, то наш "шар" - это диск. Это делает момент инерции
1/2 * M * R^2
. В соглашениях статьи Гарвина это означает, что альфа = 1/2. Гарвин не учитывает столкновения с движущейся поверхностью. Тем не менее, легко настроить вещи, учитывая движение относительно рамы движущейся поверхности. Мы просто вычитаем скорость поверхности из параллельного движения мяча перед вычислением того, что происходит при столкновении, а затем прибавляем скорость обратно.
В обозначениях Гарвина мы получаем:
Ca = -1/3 Cb - 4/3 Vb + 4/3 Vs
Va = -2/3 Cb + 1/3 Vb + 2/3 Vs
Здесь Va и Vb — скорости шара, параллельные поверхности, после и до столкновения соответственно. Vs – скорость поверхности. Ca и Cb — это R * вращение Шара после и до столкновения соответственно. (В обозначениях Гарвина C = R * омега, где омега — это вращение.)
/*
@param xFactor an int, -1, 0, or 1, giving the factor by which to
multiply the horizontal speed to get its contribution to the speed
parallel to the surface
@param yFactor an int, -1, 0, or 1, giving the factor by which to
multiple the vertical speed to get its contribution to the speed
parallel to the surface
@param speed a double, giving the speed of the surface; positive
is movement to right if we consider the surface as being horizontal
with the Ball coming down onto it
*/
private void bounce (int xFactor, int yFactor, double speed) {
// can get stuck, so add a random component to the speed
speed += 0.03 * (random.nextFloat() - 0.5);
// obtain parallel / normal speeds for horizontal and vertical
double vParallel = xFactor * this.getHorizontalSpeed() +
yFactor * this.getVerticalSpeed();
double vNormal = xFactor * this.getVerticalSpeed() -
yFactor * this.getHorizontalSpeed();
double radius = this.getImage().getHeight() / 2.0D;
// determine Garwin's Cb and Vb
double cBefore = radius * spin;
double vBefore = vParallel;
// determine Garwin's Ca and Va
double cAfter = (-1.0D/3.0D) * cBefore + (-4.0D/3.0D) * vBefore + (4.0D/3.0D) * speed;
double vAfter = (-2.0D/3.0D) * cBefore + ( 1.0D/3.0D) * vBefore + (2.0D/3.0D) * speed;
// apply direction reversal to normal component
double vNAfter = -vNormal;
// determine horizontal and vertical speeds from parallel and normal components
double vHAfter = xFactor * vAfter - yFactor * vNAfter;
double vVAfter = xFactor * vNAfter + yFactor * vAfter;
// update the Ball's state
this.setHorizontalSpeed(vHAfter);
this.setVerticalSpeed(vVAfter);
this.spin = cAfter / radius;
}
person
ialexander
schedule
19.04.2014
Y
. - person user3422952   schedule 17.04.2014