2012-12-30 54 views
0

我目前正在使用javascript和processing.js進行遊戲,並且在嘗試弄清如何對角移動東西時遇到了困難。在這個遊戲中,中心有一個物體可以拍攝周圍的其他物體。現在我沒有問題只能垂直或僅水平移動子彈,但是我很難實現子彈算法的對角線運動。在javascript中水平移動對象的算法

在嘗試而言,我試圖把我的數學思維帽和用於沿直線運動的表達式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; 
    } 

上面的代碼非常糟糕,而且速度隨線的斜率而變化。

我試着實現三角關係,但仍然徒勞。

任何幫助/建議將不勝感激!

+0

什麼是「坡」代表? –

+0

而不是斜坡,只與矢量工作。更容易和有用 – kennypu

+0

對不起,斜率將暗示m在y = mx + b公式中或基本上y座標差除以x座標差 –

回答

3

想想這樣:你想讓手裏劍移動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

WOW!你是最棒的!我知道我很接近,但這真的爲我清除了它。我最初從給定的x和y的角度看它...我怎麼找到s。但是你的答案真的把它清除了,因爲我可以通過使用距離方程(x2 - x1)/(y2 - y1)找到s,找到一個使用相反和相鄰的切線,然後將它插入x和y!哇!非常感謝! –

+0

如果您發現自己必須做一個arctan才能找到角度,請記住[atan2](http://en.wikipedia.org/wiki/Atan2)的存在,它將爲您處理符號。 – Claudiu

1

如果您知道想要移動的角度和速度,可以將其視爲極座標,然後轉換爲笛卡爾座標以獲取需要移動對象的x,y向量以進入那個方向和速度。

如果你不知道角度,也可以通過計算X和Y的差值來得出矢量(我知道你可以這樣做,因爲你可以計算兩點之間的斜率)。然後取出結果矢量併除以矢量長度得到一個單位矢量,然後可以縮放到您的速度以獲得可以移動對象的最終矢量。

(這可能是什麼kennypu意味着通過堅持與向量?

+0

這是正確的,事實上我正在接受。我的錯誤是關注s座標(在Claudiu的帖子中),而不是在處理中使用預定義函數dist()輕鬆找到它,並使用它找到x和y。感謝您的答案! –