0

我目前正在使用 javascript 和 processing.js 开发游戏,但我在试图弄清楚如何对角移动东西时遇到了麻烦。在这个游戏中,中心有一个物体可以射击周围的其他物体。现在我只能垂直或仅水平移动子弹没有问题,但是我很难为子弹算法实现对角线运动。

在尝试方面,我尝试戴上我的数学思维上限并使用 y=mx+b 公式沿直线运动,但这就是我的代码最终的样子:

ellipse(shuriken.xPos, shuriken.yPos, shuriken.width, shuriken.height); //this is what I want to move diagonally

    if(abs(shuriken.slope) > 0.65) {
        if(shuriken.targetY < shuriken.OrigYPos) {
            shuriken.yPos -= 4;
        } else {
            shuriken.yPos += 4;
        }
        shuriken.xPos = (shuriken.yPos - shuriken.intercept)/shuriken.slope;

    } else {
        if(shuriken.targetX < shuriken.OrigXPos) {
            shuriken.xPos -= 4;
        } else {
            shuriken.xPos += 4;
        }
        shuriken.yPos = shuriken.slope * shuriken.xPos + shuriken.intercept;
    }

上面的代码非常糟糕和hacky,因为速度随着线的斜率而变化。

我尝试实现三角关系,但仍然徒劳无功。

任何帮助/建议将不胜感激!

4

2 回答 2

4

可以这样想:您希望手里剑移动s像素。如果运动是水平的,它应该s水平移动像素;如果垂直,则垂直s像素。但是,如果是其他任何东西,它将是水平/垂直像素的组合。什么是正确的组合?s那么,如果你从给定点向任何方向投射距离,你会得到什么形状?没错,一个半径为 的圆s。让我们用角度来表示方向,a。所以我们有这张图:

图片

我们如何得到xy?如果你注意到,我们有一个三角形。如果你回想一下你的三角函数,这正是正弦、余弦和正切函数的用途。我通过助记符 SOHCHAHTOA 了解了它们的定义。即:Sin (a) = 对边/斜边,Cos(a) = 相邻/斜边,Tan(a) = 对边/相邻。在这种情况下,角的对面ay,角的邻接ax。因此我们有:

cos(a) = x / s
sin(a) = y / s

求解xy

x = s * cos(a)
y = s * sin(a)

所以,给定 angle a,并且你想移动你的手里剑s像素,你想s * cos(a)水平和s * sin(a)垂直移动它。

请确保您将a弧度而不是度数传递给 javascriptMath.sinMath.cos函数:

radians = degrees * pi / 180.0

这可能就是为什么您的三角函数解决方案不起作用的原因,因为这在过去让我很痛苦。

于 2012-12-30T05:22:25.433 回答
1

如果您知道要移动的角度和速度,则可以将其视为极坐标,然后转换为笛卡尔坐标以获得 x,y 向量,您需要将对象移动到该方向和速度.

如果你不知道角度,你也可以通过 X 和 Y 的差来得出向量(我知道你可以这样做,因为你可以计算两点之间的斜率)。然后取得到的向量并除以向量的长度得到一个单位向量,然后你可以缩放到你的速度来得到一个最终向量,你可以在其中移动你的对象。

(这可能就是 kennypu 坚持使用向量的意思?)

于 2012-12-30T05:28:33.770 回答