2014-01-26 57 views
0

我試圖創建一個函數,將採取一個點,一個距離,讓我在圈內氡位置在距離..例如試圖寫行星軌道的數學

SpawnPlanet(PlanetToOrbitAround,距離200 px)返回距離行星200像素的「圓」點。

我也期待對於實際旋轉邏輯,所以一個I產卵行星我有一個方法

UpdateRotation(PlanetToOrbitAround,OrbitingPlanet,200像素的距離,5度的速度)

我數學可怕,我找到了一些例子,我發現的一切似乎都不適合我(可能是因爲我對數學的理解不夠)。旋轉似乎對圍繞太陽的行星的工作,而不是圍繞行星月亮

公共Vector2 RotateAboutOrigin(Vector2點,Vector2產地,浮動旋轉) { 回報Vector2.Transform(點 - 起源,矩陣。 CreateRotationZ(rotation))+原點; }

是我使用的邏輯。與呼叫這樣...

 mPlanetLocation = RotateAboutOrigin(mPlanetLocation, new Vector2(GraphicsDevice.Viewport.Width/2 - 25, GraphicsDevice.Viewport.Height/2 - 25), .005f); 


     mMoonLocation = RotateAboutOrigin(mMoonLocation, mPlanetLocation, .005f); 

月亮奇怪和橢圓形旋轉。任何幫助將是偉大的!

回答

3

我已經在我的遊戲中經歷了這個確切的事情!

enter image description here

我有我使用的行星和其他空間物體的基類。這些包含簡單的屬性,如Position,Origin,Distance和`角度。

angle屬性使用setter根據所需角度,到太陽/物體的距離以及中心的位置+原點來更改位置。

public float Angle 
    { 
     get { return angle; } 
     set 
     { 
      angle = value; 
      position = Rotate(MathHelper.ToRadians(angle), Distance, SunPosition + Origin); 

     } 
    } 
    public static Vector2 Rotate(float angle, float distance, Vector2 centrer) 
    { 
     return new Vector2((float)(distance * Math.Cos(angle)), (float)(distance * Math.Sin(angle))) + center; 
    } 

使用這個,你可以輕鬆地做類似SpawnPlanet(SunPosition, Distance)和更新由X量每次更新的角度。 (planet.Angle += X

幾乎與您所做的事情相同,但請查看此代碼是否與您的算法匹配。對於奇怪的月球形狀,你能展示更多的代碼並展示一個軌道的例子嗎?

+0

謝謝!這個伎倆。我基本上在構造函數中添加了Angle = Math.Rand(0,364);並且它會在您指定的距離處生成並沿着該點在隨機位置生成。謝謝您的幫助! – willthiswork89

+0

沒問題,很高興它的工作。 – Cyral