Ну, ничего реалистичного, но вы могли бы что-то сделать, чтобы исходящий угол зависел только от того места, где он попадает.
Я никогда не делал никакого 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 градусов, так что было бы довольно сложно восстановиться. Поскольку я собираюсь использовать impactRange как новый velY, я собираюсь масштабировать его, чтобы сказать -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 предоставит нам центр весла), мы должен быть в состоянии рассчитать impactRange.
Нам также нужен радиус шара (я буду использовать ball.width как диаметр) и размер лопасти (paddle.width?).
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, так что мяч не отстреливают на звезды или что-то.
Отлично! Это было просто, чтобы встать и работать. Я не хранил значение impactX. Я просто проверяю, находится ли шар в прямоугольнике весла и обратный ball.center.y. Я пробовал использовать ball.center.x для impactX, но иногда мяч попадает в край и подпрыгивает прямо вверх. Как вы вычисляете impactX? – 4thSpace