Java图形没有显示出来

时间:2012-05-06 21:03:35

标签: java graphics

我对java有点新意,但我在其他编程语言方面有很多经验。现在我正在尝试创建一个简单的“烧焦地球”风格的游戏,我很难让景观出现。我使用2d高度字段来表示地形。在我的init方法中,我使用一些sin函数和随机数生成地形。我在线教程中找到了这种技术。

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方法一样。有谁知道发生了什么事?

1 个答案:

答案 0 :(得分:1)

这是你的答案:

当你得到

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

这就是失败的时候。 mod%4有时会返回负数(具体为-1),然后,1 - 1为0;所以你得到NaN的高度,并且由于某种原因,它会回到你的身上。

顺便说一下。似乎如果你没有在每次循环迭代中收到新的随机数,那么你只是利用双精度的空洞来计算,多次,数学问题的答案,你插入完全相同的值。

你问道: 其他时候它根本没有显示,我的高度[]数组中的所有值都被设置为零,就像从未调用过init方法一样。有谁知道发生了什么?

下一次,为什么不做我做的事情。当你遇到问题时,为你的初始值设置一个print语句。验证你的假设(例如,我认为(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]);
    }

}