在javascript中水平移动对象的算法

时间:2012-12-30 05:12:55

标签: javascript processing

我目前正在使用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;
    }

上面的代码很糟糕,因为速度随线的斜率而变化。

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

非常感谢任何帮助/建议!

2 个答案:

答案 0 :(得分:4)

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

image http://s13.postimage.org/50a025ktj/motion.png

我们如何获得xy?如果你注意到,我们有一个三角形。如果你记得你的三角学,这正是正弦,余弦和正切函数的用途。我通过助记符SOHCAHTOA学习了他们的定义。即:Sin(a)=相反/斜边,Cos(a)=相邻/斜边,Tan(a)=相对/相邻。在这种情况下,角度a的反面是y,角度a的相邻角度是x。因此我们有:

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

解决xy

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

因此,考虑到角度a,并且您想要移动手里剑s像素,您希望水平移动s * cos(a)并垂直移动s * sin(a)

请确保以弧度(而非度数)将a传递给javascript的Math.sinMath.cos函数:

radians = degrees * pi / 180.0

这可能就是为什么你的三角解决方案不起作用的原因,因为这在过去一直困扰我。

答案 1 :(得分:1)

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

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

(这可能是kennypu通过坚持使用矢量的意思吗?)