为什么没有为矩形设置边界并返回到相同的int?

时间:2014-12-18 02:15:00

标签: java setbounds

我试图设置这些矩形的x和y,但是任何时候我都尝试将它们设置为99.无论我在哪里设置它都会继续这样做。据我所知,我唯一可以想到的是,在类中设置的块类x和y设置为99,当我在数组中坐一个块时,它变为99.但是我设置后设置界限这块就是为什么我很困惑。

设置块:

public class World {

public static Block[][] block = new Block[100][100];
public static Character character = new Character(40, 20, "Player001");
public static Point mse = new Point(0, 0);

public static void generateWorld() {
    for (int x = 0; x < block.length; x++) {
        for (int y = 0; y < block[0].length; y++) {
            block[x][y] = Block.air;
            if(y > 10) {
                if(new Random().nextInt(5) == 1){
                    block[x][y] = Block.dirt;
                }
            }
            block[x][y].setBounds(new Rectangle(x * Block.size, y * Block.size, Block.size, Block.size));
        }
    }
}

public static void tick() {
    System.out.println(block[5][5].x);
    character.tick();
    for (int x = 0; x < block.length; x++) {
        for (int y = 0; y < block[0].length; y++) {
            block[x][y].tick();
        }
    }
}

public static void render(Graphics g) {
    for (int x = 0; x < block.length; x++) {
        for (int y = 0; y < block[0].length; y++) {
            g.drawImage(block[x][y].image, x * Block.size
                    - Character.camX,
                    y * Block.size + Character.camY,
                    Block.size, Block.size, null);
        }
    }
    character.render(g);
}

}

Block class:

public class Block extends Rectangle {

private static final long serialVersionUID = 6859844338993954281L;

public static int size = 16;
public String name;
public int id;
public Image image;
public static int blockCount = 0;
public boolean isSolid;

public Block(String name, int id, boolean isSolid) {
    this.name = name;
    this.id = id;
    this.isSolid = isSolid;
    try {
        image = ImageIO.read(getClass().getResourceAsStream(
                "/Blocks/" + name + ".png"));
    } catch (Exception e) {
        e.printStackTrace();
    }
    blockCount++;
}

public void tick() {

}

public static Block air = new Block("air", 0, false);
public static Block dirt = new Block("dirt", 1, true);

}

2 个答案:

答案 0 :(得分:0)

你怎么知道你的x和y值是99?是因为render方法将所有内容放在同一个地方吗?你能在IDE中打开block [] []数组吗?如果没有,请考虑在将每个块放入数组时打印出来。

考虑像这样重写你的循环。

public static void generateWorld() {
    Random random = new Random();
    Block result;

    for (int x = 0; x < block.length; x++) {
        for (int y = 0; y < block[0].length; y++) {
            if((y > 10) && ((random.nextInt(5) == 1)){
                result = Block.dirt;
            }
            else {
                result = Block.air;  
            }
            result.setBounds(x * Block.size, y * Block.size, Block.size, Block.size);
            block[x][y] = result;
            System.out.println ("block at position (" + x + "," + " + y + ") = " + result.x, result.y, result.width, result.height);
        }
    }
}

所以我改变了一些事情。我不是每次都重新实例化Random,一个实例就足够了。我使用&#34;持有人&#34;变量用于保存进入数组的值,以便我可以在不使用[x] [y]表示法的情况下修改它。这种表示法没有任何问题,但在println()语句中这将是乏味的。最后,我确保依次打印出每个块的内容。这应该表明您的值正在被正确初始化。

运行时,您可以考虑将block [] []数组的大小减小到10x10。直到你弄清楚发生了什么。

如果块在初始化时都正确打印出来,那么它会告诉您出现问题,然后它会告诉您显示数组内容的代码部分有问题。 (你没有包括)。

我希望这会有所帮助。

答案 1 :(得分:0)

Block.air只是一个对象。您正在设置大多数block数组以包含对该单个对象的引用,这会导致所有这些元素共享该Block对象:

Array elements pointing to Block.air

正如您所料,调用setBounds会立即改变原始的Block.air,并且大多数元素都会看到更改(因为大多数元素都指向相同的共享Block.air对象)。

您需要做的是使block数组的每个元素成为自己的对象。从Rectangle继承的clone()方法可能是最简单的方法:

Random random = new Random();
block[x][y] = (Block) Block.air.clone();
if (y > 10) {
    if (random.nextInt(5) == 1) {
        block[x][y] = (Block) Block.dirt.clone();
    }
}
block[x][y].setBounds(x * Block.size, y * Block.size, Block.size, Block.size);