嗯,没有什么现实的,但你可以做一些事情,这样外向角度只取决于它击中的桨上的位置。
我从来没有做过任何 iPhone 或客观的 C 编码,所以我只会用伪/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,但我希望你能大致了解)。
编辑:添加一些关于获得 ImpactX 的想法。
假设你有 ball.center.x 和 paddle.center.x(不知道你怎么称呼它,但假设 paddle.center.x 会给我们桨的中心)我们应该能够从中计算影响范围。
我们还需要球的半径(我假设 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 之间,这样球就不会射向星星或其他东西。