Ну, ничего реалистичного, но вы могли бы что-то сделать так, чтобы угол наклона зависел только от места попадания на весло.
Я никогда не делал ни 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, чтобы шар не попал в звезды или что-то в этом роде.