2012-05-06 80 views
3

我對Java有點新,但是我在其他編程語言方面有很多經驗。現在我正在嘗試創建一個簡單的「焦土」風格的遊戲,並且我無法讓景觀出現。我使用二維高度場來表示地形。在我的init方法中,我使用幾個sin函數和隨機數生成地形。我在網上找到了這個技巧。Java圖形不顯示

float flat, peak; 
flat = 70; peak = 50; 

int rand1, rand2, rand3; 
rand1 = gen.nextInt() % 4 + 1; 
rand2 = gen.nextInt() % 4 + 1; 
rand3 = gen.nextInt() % 4 + 1; 

for (int a=0; a<750; a++) { 
    double height = peak/rand1 * Math.sin((double)a/flat * rand1 + rand1); 
    height += peak/rand2 * Math.sin((double)a/flat * rand2 + rand2); 
    height += peak/rand3 * Math.sin((double)a/flat * rand3 + rand3); 

    height += 250; 
    heights[a] = (int)height; 
} 

然後在我paint()方法我繪製地形,與高度扯到從屏幕的底部,這是750個像素長和500的高像素。

public void paint(Graphics g) 
{ 
    g.setColor(Color.green); 

    for (int a=0; a<750; a++) { 
     g.fillRect(a, 500-heights[a], 1, heights[a]); 
    } 
} 

但是,我有一個主要問題,讓地形出現。大約一半的時間顯示,看起來不錯,隨機,只是我想要它。其他時候它根本不顯示,我的高度[]數組中的所有值都被設置爲零,就好像init方法從未被調用一樣。有誰知道發生了什麼事?

+6

對於如果你的高度數組歸零,那麼問題更好地幫助越早用圖形和油漆/的paintComponent() – mKorbel

+1

一個[SSCCE(http://sscce.org/)證明你的問題,編輯您的問題幾乎不涉及GUI。對你來說也不是很明顯嗎? –

+2

從哪裏調用'init'方法? 「高度」如何以及在哪裏創建的? – GETah

回答

1

這是你的答案:

當你

rand1 = 0 (or 1) 
rand2 = 0 (or 1) 
rand3 = 0 (or 1), 

時失敗之時。 mod%4有時會返回負數(特別是-1),然後,1 - 1爲0;所以,你爲自己的身高而獲得NaN,並且由於某種原因,這會回到0。

Btw。看來如果你在每次循環迭代中都沒有收到新的隨機數,那麼你只是利用雙精度來計算一個數學問題的答案,在這個數學問題中你插入的是完全相同的值。

你問: 其他時間它根本不顯示,我的高度[]數組中的所有值都設置爲零,就好像init方法從未調用過一樣。有誰知道發生了什麼事?

下一次,爲什麼不做我所做的事情。當您遇到問題時,請爲您的初始值打印一份打印聲明。驗證你的假設(例如,我認爲(x mod 4)+ 1)不能爲負數。當發生問題時rand1,rand2,rand3,的值是什麼。那麼,那是怎麼發生的?這是如何影響每次調用Sin(..)後的高度?只需通過打印聲明加總情況,查明何時中斷,中斷情況以及問題何時開始。

int[] heights = new int[750]; 
public MathTest() 
{ 
    Random r = new Random(); 
    float flat; 
    float peak; 
    flat = 70; 
    peak = 50; 

    int rand1; 
    int rand2; 
    int rand3; 

    int x = r.nextInt(); 
    int y = r.nextInt(); 
    int z = r.nextInt(); 

    System.out.println("x : " + x); 
    System.out.println("y : " + y); 
    System.out.println("z : " + z); 

    System.out.println("-210263172"); 
    System.out.println("-724188689"); 
    System.out.println("-1092425465"); 

    System.out.println(-210263172 % 4); 
    System.out.println(-724188689 % 4); 
    System.out.println(-1092425465 % 4); 

    rand1 = x % 4 + 1; 
    rand2 = y % 4 + 1; 
    rand3 = z % 4 + 1; 


    for(int a = 0; a < 750; a++) 
    { 
     System.out.println("rand1: " + rand1); 
     System.out.println("rand2: " + rand2); 
     System.out.println("rand3: " + rand3); 
     double height = 
      peak/rand1 * Math.sin((double) a/flat * rand1 + rand1); 
     height += 
      peak/rand2 * Math.sin((double) a/flat * rand2 + rand2); 
     height += 
      peak/rand3 * Math.sin((double) a/flat * rand3 + rand3); 

     height += 250; 
     heights[a] = (int) height; 
    } 
    int i; 
    for(i = 0; i < 23; i++) 
    { 
     System.out.println("heights[" + i + "]: " + heights[i]); 
    } 

}