Отскок мяча от 4 стен сцены - PullRequest
0 голосов
/ 05 января 2010

Просто любопытно. Когда я отскакиваю мяч от стен сцены, используя следующую технику.

if(y > sRef.stageHeight || y < 0)
{
    yDir = yDir * -1;
}
else if ( x > sRef.stageWidth || x < 0)
{
        xDir = xDir * -1;
}


x += xspeed * xDir;
y += yspeed * yDir;

Вышеуказанное выглядит хорошо и работает хорошо. Но если я решу использовать углы вместо этого, как показано ниже ...

if(y > sRef.stageHeight || y < 0)
{
    angle += 45;

}
else if ( x > sRef.stageWidth || x < 0)
{
    //angle = angle * -1;
    angle += 45;

}
vx = Math.cos(angle * Math.PI / 180) * bSpeed;
vy = Math.sin(angle * Math.PI / 180) * bSpeed;
x += vx;
y += vy;

Мало того, что мяч прыгает и прыгает. но через очень часто он начинает идти либо в вертикальном движении у = 5; х = 0; или горизонтальное движение x = 5, y = 0. И остается таким. Почему первый метод работает нормально, а другой - ужасно? Может быть потому, что Math.cos и Math.sin возвращают очень большие десятичные дроби. Может ли кто-нибудь помочь мне, пожалуйста, потому что я действительно предпочитаю использовать второй метод.

Спасибо

Ответы [ 5 ]

2 голосов
/ 05 января 2010

не имеет смысла добавлять 45 к углу. Это будет направлять ваш мяч против часовой стрелки, независимо от того, на какую стенку он попадает. почему вы предпочитаете использовать второй способ? Первый способ имеет больше смысла. вы можете использовать angle = Math.atan2(vy,vx), чтобы получить угол из ваших координат vx / vy

Редактировать Вы утверждаете, что у вас может быть более простой способ контролировать скорость удара мяча по движущейся лопасти, используя угол. На самом деле, что действительно происходит, так это то, что когда мяч ударяется о весло, некоторая часть скорости весла передается мячу (на самом деле часть этого теряется из-за трения или преобразования в угловой момент)

if (hit a paddle) {
   vx = -vx;
   vy += a * paddle_vy; // a is a fudge factor between 0 and 1
}
if (hit a vertical wall)
   vx = -vx;
if (hit a horizontal wall)
   vy = -vy;

Там действительно нет способа симулировать такое поведение, используя только угол.

1 голос
/ 05 января 2010

Например, увеличение на 45 градусов не отражает отражение от поверхности. Представьте, что шар движется почти прямо вверх и немного влево, скажем, под углом 70 градусов. Когда он достигнет вершины, вы добавите 45, чтобы получить 105, который все еще почти выпрямлен, поэтому мяч будет продолжать выходить за пределы (вверх), и вы снова добавите 45, чтобы получить 155, который все еще идет. до того, как, наконец, достигнуть 200.

Вы должны использовать -ve существующий угол для отражения "крыши" и 180-градусный для отражения от стены, я думаю.

0 голосов
/ 05 января 2010

Я ценю всю обратную связь. Но причина, по которой я хотел использовать углы, заключается в том, чтобы контролировать направление движения мяча в зависимости от скорости вращения ракетки. В Псуедо это то, что я пытаюсь сделать ...

var tempSpeedX:Number = xspeed;
var tempSpeedY:Number = yspeed;
var tempDirY:Number = yDir * -1;

tempSpeedY = tempSpeedY * tempDirY;
var angle:Number = Math.atan2(tempSpeedY , tempSpeedX );

//angle = angle + ( paddle.cspeed * .4 );
xspeed = Math.cos(angle);
yspeed = Math.sin(angle);
trace(xspeed);
trace(yspeed);
yDir += tempDirY;
isHit = false;

tempSpeedX, tempSpeedY и tempDirY - временные переменные, используемые для хранения скорости x и y моего шара. tempDirY используется для удержания моего направления оси Y. Либо -1, либо 1. Я пытаюсь воссоздать новый ракурс.

Допустим, мяч движется при vx = 3, vy = 3. Я знаю, что при ударе шар будет двигаться в этом направлении. Поэтому я переворачиваю ось Y и получаю угол. Вот что делает следующий код

tempSpeedY = tempSpeedY * tempDirY;

Я беру текущее направление и умножаю его на скорость, чтобы перевернуть его в другом направлении. Далее я получаю угол, используя atan2

var angle:Number = Math.atan2(tempSpeedY , tempSpeedX);

Как только я получу новый угол, На данный момент. Я мог бы изменить направление туда, куда я хочу, чтобы мяч двигался в зависимости от моей скорости. где это закомментировано, я положил код, чтобы изменить направление. Затем я бы вернул его к нормальному углу, используя грех и косинус. затем снова вернемся к xspeed и yspeed. но этот код не работает. не уверен, что не так.

Я знаю, что то, что я делаю, слишком сложно из-за недостатка знаний в физике. Но основной способ вызывает слишком много осложнений, которые я не могу действительно объяснить.

Допустим, по старинке, мяч не движется в направлении, в котором весло пытается его взять. xDir постоянно переворачивается от -1 к положительному значению, в результате чего скорость изменяется с отрицательного на положительное. мое весло движется вперед и назад, так что скорость отрицательная и положительная. и поэтому иногда указания не идут так, как они должны. поэтому я пытаюсь придумать лучший способ управления мячом с помощью весла

0 голосов
/ 05 января 2010

Должен изучить физику, чтобы понять это правильно. Вам нужно подумать о скорости в системе координат относительно стены: один компонент параллелен стене, а другой перпендикулярен. (Для простоты я приму 2D).

Компонент скорости, перпендикулярный стене, меняет знак после столкновения и имеет ту же величину, что и до столкновения (при условии упругого удара без потери энергии).

Компонент скорости, параллельный стене, не изменяется (при условии упругого удара и пренебрежения эффектами трения и вращения).

Если вы воспользуетесь этим рецептом для определения вектора скорости после удара, вы все поймете правильно.

  1. Преобразовать координаты (x, y) в "координаты стены" (параллельные и перпендикулярные).
  2. Поменять знак перпендикулярной составляющей скорости.
  3. Преобразовать обратно в (x, y) координаты.
0 голосов
/ 05 января 2010

Из вашего другого потока , ваши vx, vy на самом деле являются катетами угла, который вы ищете (на самом деле вектор, потому что он имеет величину) ...

Хорошо подумать, что вы можете лучше контролировать углы, но для того, что вы пытаетесь сделать, вам в основном нужно работать с компонентами X и Y этого угла ...

Я думаю, что у вас есть только одна проблема с вашим предыдущим подходом: вам нужно лучшее управление, когда столкновение происходит, поэтому на следующем шаге мяч не столкнется снова. Для стен довольно просто:

if(x<0) {
  vx*=-1;
  x=0;
}

Вы можете использовать ту же логику с веслом, но это довольно сложно сделать правильно, так как на следующей итерации весло может переместиться через положение отскочившего мяча, снова отскочив назад, на этот раз в противоположном направлении, следовательно, застрять в весле.

Вы можете попробовать несколько вещей, чтобы исправить это, например, предотвратить два или более последовательных столкновения весла и / или ограничить вертикальное движение весла, поэтому при каждом столкновении вы устанавливаете Y шара от весла, чтобы гарантировать это не ударит его снова в следующей итерации (как со стенами).

Правильный способ сделать это, тем не менее, гораздо сложнее, поскольку он зависит от точного прогнозирования, куда мяч попадет (исключая проблему с итерациями), комбинируя вектор весла с шаром в этой точной точке, и в целом много больше математики. Кто-то может объяснить это намного лучше, чем я. Или вы можете проверить физический движок ^^

Тем не менее, для изучения porpouse, я бы посоветовал вам продолжать пытаться решить столкновение с вашим предыдущим подходом, а затем перейти к более сложным вещам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...