【发布时间】:2017-07-17 21:47:25
【问题描述】:
我正在用 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。
老实说,我是通过反复试验得到的,我不太明白为什么正好是 60 和 120。
【问题讨论】:
-
我知道您并没有要求这个,但是您是否考虑过使用 javascript 物理引擎?他们中有很多人会做这种事情。如果您有兴趣,有一个名为 (Phaser)[phaser.io/] 的游戏引擎非常简单,并且内置了物理引擎。如果您不想要这个,请随意忽略它:)
-
谢谢,但这确实是我游戏中唯一的“物理”部分,我希望自己能够解决它,现在我已经用 node.js 做了太多了 :(。
-
你能描述一下什么地方不能正常工作吗?此外,尝试简化您的问题,并从垂直墙或水平墙开始。反射角总是入射角。或者正如 Cyberchase 所说,入角 = 出角。这适用于 90 度和 0 度的墙壁。但是其他角度呢?想想如果你把整个图像旋转起来,让 30 度的墙变成 90 度的墙(垂直)会发生什么。球的角度会如何变化?
-
我认为可能令人困惑的一件事是您说“蓝色是 30 度,棕色是 60 度”等等。如果您查看所有蓝色墙壁,法线(即球的角度会反映出来)是不同的。有些可能称为 30 度,有些可能称为 -30 度,具体取决于您测量的位置。弄清楚你是如何记录你的球角度的,并在墙上也小心地使用这个标准。
-
有没有可能把它变成一个函数?目前,我只是在遇到不同的角落时将 if 语句用于不同的功能(如果您查看我编辑的帖子)。
标签: javascript math