2013-02-18 113 views
1

我希望這是一個可以接受的問題,因爲這是一個數學問題而不是編程問題。根據旋轉運動的精靈

我正在開發一個基本的太空射擊遊戲,使用cocos2d框架,用戶控制太空飛船並射擊小行星/敵人,敵人也在飛船處射擊(原始呃?)。

被敵人擊中的'激光'是一個形狀似管的管子,通常只在x軸上從右到左移動。這是很容易實現的,移動與這行代碼創建:

currentEnemyProjectile.position = ccp(currentEnemyProjectile.position.x - ((screenSize.width/kLaserSpeed)* dtSixty), currentEnemyProjectile.position.y); 

我也有一個特殊的敵人,它駐留在屏幕的中間和旋轉的飛船開火了彈丸,所以如果太空飛船的位置與敵人不同,那麼彈道精靈將旋轉,然後移動到飛船的位置,所以它也需要通過Y軸。我目前使用的代碼來實現這一

float xDiff = ((screenSize.width/kLaserSpeed)* dtSixty); 
float yDiff = (xDiff/57) * currentEnemyProjectile.rotation; 

currentEnemyProjectile.position = ccp(currentEnemyProjectile.position.x - xDiff, currentEnemyProjectile.position.y + yDiff); 

我只是工作了這一點,作爲一個臨時的解決辦法,我知道這是不是做事的最佳方式。它有點類似,但是當我正在計算沿着x軸的運動的y偏移量時,如果它們繼續沿着y軸行進,則投擲物將移動得更快。理想情況下,如果他們進一步向上或向下移動,他們應該沿x軸移動得更慢,以便任何軌跡的移動速率都是恆定的。 (我希望我已經解釋得那麼好)

自從我上一次有數學課以來,這已經過去了大約10年,所以我的幾何/三角幾乎是朦朧的/不存在的,任何人都可以闡明如何做到這一點做完了?

另外,值得注意的是我想在不使用cocos2d動作的情況下做到這一點。我寧願按照我現在正在操作時間流程作爲遊戲一部分的每一幀移動我的精靈,因此我需要比cocos2d操作可提供的更多控制。

在此先感謝您的幫助。

+0

我對你的變量有點困惑。 kLaserSpeed應該以​​距離/秒爲單位。 dtSixty與60Hz時鐘頻率的增量時間相似嗎?爲什麼xDiff依賴於屏幕寬度?所有你需要做的就是乘以速度* dt來得到移動的距離,稱之爲「d」,沿着三角形的斜邊。因此,dx = d * sin(角度)和dy = d * cos(角度)。確保你檢查了合適的標誌。 – Pat 2013-02-19 01:37:33

+0

我用kLaserSpeed劃分屏幕寬度的原因是,這會讓我在不同設備(iPhone 4/iPhone 5/iPad)上獲得持續的遊戲體驗,例如,如果kLaser速度爲500,那麼對象將行進1/500寬度屏幕的大小與屏幕大小無關。 dtSixty只是最後一幀乘以60後的時間。我原本是在沒有調整當前幀速率的情況下啓動該項目的,因此當我稍後想要這樣做時,由於它運行速度爲60 fps,如果我將自上一幀以來的時間乘以60,我可以保留相同的數字速度。 – SteveB 2013-02-19 07:38:53

+0

我會看看你玩我的方程式,看看我能不能把它運用起來,我想我可以做一些我的三角學習。謝謝您的幫助。 – SteveB 2013-02-19 07:39:52

回答

0

要使用起始位置,角度,以及距離找到的位置,該公式如下:

ccp(x + (distance * sin(angle)), y + (distance * cos(angle))) 

請注意,對於此公式的角度將必須在弧度,而不是度數。你可以把度數轉換成這樣的弧度:

radians = degrees * PI/180 
+0

完美的作品,非常感謝! – SteveB 2013-02-19 22:48:07

0

試試這個。我意識到,既然你知道該播放器的矢量,你不需要三角。您只需計算一次v和h,以便您可以保存這些值,而不是在每一幀中計算它們。

// Vector from enemy to player 
CGPoint v = enemy.position - player.position; 

// distance from enemy to player (sqrt of the dot product of v with v) 
float h = sqrt(v.x*v.x+v.y*v.y); 

// Desired distance to move along v 
delta = ((screenSize.width/kLaserSpeed)* dtSixty); 

// delta/h is the % moved along v, find the % moved in the x and y direction 
xDiff = v.x * delta/h; 
yDiff = v.y * delta/h;