2016-10-30 48 views
0

這裏是地球類:試圖創建一個隨機「太陽系」

public class Planet extends CelestialBody { 

private static Random r = new Random(); 
    private static Star star; 

    public Planet(Star star, int orbitRadius, int x, int y){ 
     name = "PLACEHOLDER"; 
     radius = Tools.intBetween(Settings.MAX_PLANET_SIZE, Settings.MIN_PLANET_SIZE); 
     color = Tools.rObjFromArray(Settings.PLANET_COLORS); 
     this.star = star; 
     this.orbitRadius = orbitRadius; 
     this.x = x; this.y = y; 
    } 


    public static Planet createNewPlanet(Star star, int orbitRadius){ 
     int px = (int) (star.x + orbitRadius * Math.cos(Math.toRadians(r.nextInt(360)))); 
     int py = (int) (star.y + orbitRadius * Math.sin(Math.toRadians(r.nextInt(360)))); 

     return new Planet(star, orbitRadius, px, py); 
    } 

    public void render(Graphics g){ 
     //Draw orbit 
     g.setColor(Color.white); 
     g.drawOval(star.x - orbitRadius, star.y - orbitRadius, orbitRadius * 2, orbitRadius * 2); 

     //Draw planet 
     g.setColor(color); 
     g.fillOval(x - radius, y - radius, radius * 2, radius * 2); 
    } 
} 

orbitRadius = distance from planet to star (random); 

radius = planet's radius (random) 

result

問的意見,如果你需要更多的代碼,我知道這是一個noob問題,但我就是不明白,爲什麼軌道不與行星排隊。謝謝。

+2

歡迎計算器!乍一看,你的代碼看起來很好。你可以發佈Planet類的其餘部分嗎?如果你想讓它更容易爲人們幫助,你可以嘗試做一個[Minmal,完全和可驗證的示例](http://stackoverflow.com/help/mcve)。 – 11684

+0

沒關係,我想通了,問題是什麼。 – 11684

+0

我在全班編輯。 – Tom

回答

2

的問題是在以下兩行:

int px = (int) (star.x + orbitRadius * Math.cos(Math.toRadians(r.nextInt(360)))); 
int py = (int) (star.y + orbitRadius * Math.sin(Math.toRadians(r.nextInt(360)))); 

因爲你叫r.nextInt(360)兩個獨立的時候,你每次都得到一個不同的隨機數。

的後果是,x和y座標是不同的角度,我認爲這是明顯的,爲什麼這會成爲一個問題。

的解決方案很簡單:撥打r.nextInt一次,並保存結果:

double randomAngle = Math.toRadians(r.nextInt(360)); 
int px = (int) (star.x + orbitRadius * Math.cos(randomAngle)); 
int py = (int) (star.y + orbitRadius * Math.sin(randomAngle)); 

我想這應該解決的問題。

+0

謝謝!這很明顯,但我無法弄清楚。 – Tom