我正在用 javascript 制作一个游戏,其中一个物体应该从墙上反弹。我真的尝试让它自己工作,但它从来没有正常工作。
假设有一个球在笼子内弹跳(蓝色 = 30°,棕色 = 60°);
球的坐标是已知的。运动角度是已知的。碰撞点 (P) 坐标已知。墙的角度是已知的。球的位置正在使用以下函数在 setInterval 函数内更新其坐标:
function findNewPoint(x, y, angle, distance) {
var result = {};
result.x =(Math.cos(angle * Math.PI / 180) * distance + x);
result.y = (Math.sin(angle * Math.PI / 180) * distance + y);
return result;
因此,在碰撞时,应该有一个函数可以适当地改变球的角度。这看起来是一个非常复杂的问题,因为即使我知道墙是 30°,了解球从哪一侧撞到墙上也很重要。我尝试使用“平面中直线的反射”公式和一些向量,但它对我来说从来没有成功。我并不期望用代码得到完整的答案,如果有人可以建议应该以什么方式对其进行编程,它也会有所帮助。
编辑:
谢谢你们的提示,我意识到是什么造成了最混乱;如果我用鼠标在画布上选择一个角度,起始坐标(0,0)位于左下角。但由于画布的起始坐标位于左上角,因此必须考虑这一点。
基本上使用这个公式来计算角度:
function angle(cx, cy, ex, ey) {
var dy = ey - cy;
var dx = ex - cx;
var theta = Math.atan2(dy, dx);
theta *= 180 / Math.PI;
return theta;
}
如果球从 (50,50) 移动到 (100,100),则角度将为 -45。
Now, this angle changes in the following way when hitting walls:
老实说,我是通过反复试验得出这些结果的,但我并不真正理解为什么是 60 和 120。