2015-11-24 2 views
1

Я знаю, что в Интернете так много всего в этом мире, и я просмотрел его довольно много, но я просто не могу заставить его работать с моим кодом. Я знаю математику за ней, но снова пытаюсь превратить ее в код. У меня есть 2 переменные скорости для мяча float xSpeed, ySpeed. Оба равны 3 (или -3 в зависимости от столкновения - у меня просто есть базовый столкновение atm). Я также использую прямоугольник для шарика ballRect, а также весло paddleRect. Я обновляя позицию так:Лобовое столкновение с углом

ballRect.X += xSpeed; ballRect.Y += ySpeed;

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

double relativeBallPos = (paddleRect.X + ballRect.X); 
     double ballVelx = xSpeed; 
     double ballVely = ySpeed; 

     double angleRads = Math.Tan((ballVelx/relativeBallPos)); 
     double angleInDeg = angleRads * (180/Math.PI); 
     double angleOfReflection = (angleInDeg * 2); 

     ballVelx = ballVelx * angleOfReflection; 


     if (ballRect.X + (ballRect.Width/2) < paddleRect.X + (paddleRect.Width/2)) 
     { 
      xSpeed = (float)-ballVelx; 
     } 
     else if (ballRect.X + (ballRect.Width/2) > paddleRect.X + (paddleRect.Width/2)) 
     { 
      xSpeed = (float)ballVelx; 
     } 

(Это уходит на (возможно, неправильно) угле и просто идет прямо вверх, после первого удара) Спасибо за любую помощь :)

ответ

1

Если мяч пересекает любой горизонтальный порог (горизонтальные стороны кирпичей или лопастей), отрицать ySpeed. Если он пересекает любой вертикальный порог, отрицайте xSpeed. Там, у вас есть функциональная прорывная игра.

Вы можете добавить немного больше полируют, изменяя угол мяч, когда он попадает на лопатки, основываясь на положении столкновения вдоль нее, с центром является полным размышляют (то есть отрицание ySpeed) и xSpeed получить фактор расстояние (положительное или отрицательное) от расстояния от центра.

+0

«Вы можете добавить немного больше полируют, изменяя угол мяч, когда он попадает весло, основанное на положении столкновения вдоль него. Вот что я пробовал для себя. (Поместите код в мой пост) –

0

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

Решение проблемы с отсутствием весла увеличивает скорость галочки, т. Е. Процесс игры перемещается чаще.

Мяч для прилипания весла можно смягчить, выполняя рулон движения объекта во времени. Например, у вас есть объекты A и B, которые сталкиваются в какой-то момент времени. Если вы просто измените свои скорости X и Y, вы можете столкнуться снова в следующий момент времени, чтобы вы снова отменили их скорость и т. Д., Который выглядит так, как будто он застрял. Иногда он может застревать на одной оси, поэтому он будет скользить по весле, а затем идти прямо вниз, что является еще одним побочным эффектом той же проблемы.

Как сделать откат? Вы знаете, где движется A, и предположим, что B является веслом, поэтому он статичен. Вы знаете, что A сталкивается с B в данный момент. Вы можете вычислить вектор движения A и сдвинуть A назад во времени через этот вектор. Например, если верхний левый угол экрана равен (0,0), и A двигался со скоростью X=+10,Y=+10, вы бы переместили его полностью или частично на шаг (в зависимости от того, насколько сложным вы хотите пойти с этим), поэтому (-10,-10) или его фракции. Вы можете использовать прямоугольник пересечения для вычисления точных значений и только двигаться достаточно, чтобы объекты едва касались друг друга.

В идеале вы должны отражать вектор от поверхности удара (используйте физику, то есть угол удара = угол отражения), и перед применением новых скоростей переместите свой шар так, чтобы он не сталкивался с веслом. Чтобы упростить, вы можете предположить, что ваша поверхность удара горизонтальна и является прямой линией, поэтому ваша формула отражения очень проста.

Эта тема хорошо освещена здесь (хотя использование XNA, тот же принцип применим):

Смежные вопросы