我一直在努力解决这个问题,而且看起来并不太难,但是我累了,我尝试的越来越复杂(但它和#39;可能很容易)。
我的目标是让球从另一个球上弹开。似乎很容易。
球2由用户的鼠标控制(到目前为止它有点像单人乒乓球,但它是一个圆而不是一个矩形)所以它的速度不是物质
球1有一些属性,包括dx(每帧移动的x距离)和dy(dx,但对于y坐标)
到目前为止,我所遇到的问题是,你不知道哪些值是正的,哪些是负的(因此速度可能会立即严重增加或减少),你可能能够解决这个问题。还有很多其他的,但我现在太困惑了。
这是此功能的重要部分。此外,我试图设置它,以便dx + dy始终相同,即使数字发生变化,也会让它看起来更自然。
if (collision(ball, paddle)) {
diffX = paddle.x-ball.x;
diffY = paddle.y-ball.y;
totalVel = ball.dx+ball.dy;
dir = {
x : diffX/(diffX+diffY)*-totalVel,
y : diffY/(diffX+diffY)*-totalVel
};
ball.dx = dir.x;
ball.dy = dir.y;
}
这是一个包含完整代码的JSFiddle https://jsfiddle.net/a2prr0uw/1/
答案 0 :(得分:2)
首先让我们首先定义“弹跳”是什么 - 速度是相同的,但方向(在两个轴上)将被反转。如果我们像对待一样对待dx和dy,那么我们可以先得到球的传入速度:
var ballSpeed = Math.sqrt((ball.dx * ball.dx) + (ball.dy * ball.dy));
无论dx和dy在做什么,上述值都将是正值。
接下来,我们需要传球的方向 - 这个位与你现在的相同:
diffX = paddle.x-ball.x;
diffY = paddle.y-ball.y;
然而,如果我们将其视为矢量,它实际上具有完全未知的长度。所以,让我们将它标准化,使它成为长度为1的方向向量:
var distanceBetweenPaddleAndBall = Math.sqrt((diffX * diffX) + (diffY * diffY));
diffX /= distanceBetweenPaddleAndBall;
diffY /= distanceBetweenPaddleAndBall;
diffX和diffY现在是一个标准化的方向向量 - 球当前进入的方向 - 而ballSpeed是我们想要的速度。
所以现在我们将应用弹跳 - 翻转方向并保持速度。这就是:
dir = {
x : -diffX * ballSpeed,
y : -diffY * ballSpeed
};
把它们放在一起,我们最终得到这个:
if (collision(ball, paddle)) {
diffX = paddle.x-ball.x;
diffY = paddle.y-ball.y;
// How fast is the ball coming in?
var ballSpeed = Math.sqrt((ball.dx * ball.dx) + (ball.dy * ball.dy));
// How far is the ball from the paddle?
var distanceBetweenPaddleAndBall = Math.sqrt((diffX * diffX) + (diffY * diffY));
// Normalise diffX and diffY so we have a direction vector:
diffX /= distanceBetweenPaddleAndBall;
diffY /= distanceBetweenPaddleAndBall;
// Apply the bounce and the original ball speed:
dir = {
x : -diffX * ballSpeed,
y : -diffY * ballSpeed
};
ball.dx = dir.x;
ball.dy = dir.y;
}
答案 1 :(得分:0)
不是答案,而是对你的弹跳逻辑的一些考虑: