Изменение угла, когда мяч попадает на весло - PullRequest
1 голос
/ 18 июня 2009

Я бы хотел отклонить шар под углом в зависимости от того, где он попал в ракетку. Прямо сейчас я изменяю только координату y, что приводит к неинтересному отклонению. Он будет наклоняться, но не зависит от места удара о весло. Я хотел бы что-нибудь более веселое. Скорость, импульс, масса и другие факторы не должны приниматься во внимание. Просто угол в зависимости от места удара весла. Я прочитал это Не ошибка числа (NAN) при обнаружении коллизий в приложении для iphone , но это кажется слишком сложным для того, что я ищу. Есть ли более простой способ рассчитать прогиб?

Объектами являются два UIImageViews.

Ответы [ 3 ]

4 голосов
/ 18 июня 2009

Ну, ничего реалистичного, но вы могли бы что-то сделать так, чтобы угол наклона зависел только от места попадания на весло.

Я никогда не делал ни iPhone, ни объективного C-кодирования, поэтому я просто напишучто-то в псевдо-коде.

Сначала я вычислю скорость, которая равна длине вектора скорости, или:

double speed = sqrt(velX * velX + velY * velY); // trigonometry, a^2 + o^2 = h^2

Затем мы хотим вычислить новый уголоснованный на том, где мы поразили весло.Я собираюсь предположить, что вы сохраняете столкновение X в ImpactX и длину весла в PaddleLength.Таким образом, мы можем рассчитать исходящий угол.Сначала давайте выясним, как рассчитать диапазон, чтобы получить значение от -1 до 1.

double proportionOfPaddle = impactX / (double) paddleLength; // between 0 and 1
double impactRange = proportionOfPaddle * 2 - 1; // adjust to -1 and 1

Давайте предположим, что мы не хотим полностью отклонять шар в сторону или на 90 градусов,так как это было бы довольно трудно оправиться от.Так как я собираюсь использовать в качестве нового velY ImpactRange, я собираюсь уменьшить его до -0,9 до 0,9.

impactRange = impactRange * 0.9;

Теперь нам нужно вычислить velX, чтобы скоростьконстанта.

double newVelX = impactRange;
double newVelY = sqrt(speed * speed - newVelX * newVelX); // trigonometry again

Теперь вы возвращаете newVelX и newVelY, и вы получаете отскок, зависящий от удара и скорости.

Удачи!

(Могут быть ошибки вздесь, и я мог бы перевернуть X или Y, но я надеюсь, что вы поняли основную идею).

EDIT : добавление некоторых мыслей о получении воздействияX.

Предположим, у вас есть ball.center.x и paddle.center.x (не знаю, как вы это называете, но давайте предположим, что paddle.center.x даст нам центр весла), мы должны быть в состояниирассчитайте из этого коэффициент воздействия.

Нам также понадобится радиус шара (в качестве диаметра я буду использовать ширина шарика) и размер лопасти (ширина весла?).

int ballPaddleDiff = paddle.center.x - ball.center.x;
int totalRange = paddle.width + ball.width;

Наименьшее значение для ballPaddleDiff будет, когда мяч просто касается боковой поверхности весла.Этот ballPaddleDiff будет тогда paddle.width / 2 + ball.width / 2.Таким образом, новый ImpactRange будет иметь значение

double impactRange = ballPaddleDiff / (double) totalRange / 2;

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

0 голосов
/ 19 июня 2009

Следующий код (C ++, но достаточно простой для преобразования в ObjC), берет входящий 2D-вектор и отражает его на основе нормали поверхности (лица вашего понга).

Вы можете добавить какой-нибудь случайный «забавный фактор», выбрав случайное смещение, которое вы примените к «скалярному» - для изменения скорости или к нормали поверхности, чтобы изменить угол отражения.

Я использую это в своем проекте iPhone, и он отлично работает:)

void vec2ReflectScalar(vec2& vResult, const vec2& v1, const vec2& normal, float scalar)
{
    vec2  _2ndotvn;
    float dotVal = vec2DotProduct(v1, normal); 

    vec2Scale(_2ndotvn, normal, scalar * 2.f * dotVal);
    vec2Subtract(vResult, v1, _2ndotvn); 
}

void vec2Reflect(vec2& vResult, const vec2& v1, const vec2& normal)
{
    vec2ReflectScalar(vResult, v1, normal, 1.f);
}
0 голосов
/ 18 июня 2009

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

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

Мы уже ожидаем, что выходной угол = -1 * входной угол. Ожидается, что выходная скорость также будет равна -1 * входной скорости. Так что, если вы хотите все перепутать, настройте их. Вы можете увеличить выходной угол пропорционально расстоянию от центра лопасти. Вы также можете увеличить угол или скорость, пропорциональную скорости весла при его ударе.

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

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