Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不为矩形设置边界并返回相同的整数?_Java_Setbounds - Fatal编程技术网

Java 为什么不为矩形设置边界并返回相同的整数?

Java 为什么不为矩形设置边界并返回相同的整数?,java,setbounds,Java,Setbounds,我试图设置这些矩形的x和y,但每次我尝试时,它们都保持在99。不管我把它放在哪里,它都会一直这样。据我所知,我能想到的唯一一件事是,在类中创建的块类x和y被设置为99,当我在数组中放置一个块时,它会更改为99。但是我会在它设置块后设置边界,这就是为什么我会感到困惑 设置块: public class World { public static Block[][] block = new Block[100][100]; public static Character character = n

我试图设置这些矩形的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);
}

}

你怎么知道你的x和y值是99?是因为渲染方法将所有内容放在同一位置吗?能否在IDE中打开块[][]数组?如果没有,请考虑将每个块的内容打印到数组中。

考虑像这样重写您的循环

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,一个实例就足够了。我使用一个holder变量来保存进入数组的值,这样我就可以在不使用[x][y]符号的情况下修改它。这种表示法没有错,但在println语句中会很乏味。最后,我确保依次打印出每个块的内容。这将向您显示您的值确实被正确初始化

当你运行这个时,你可以考虑将块[][]数组的大小减少到10x10。直到你弄清楚到底发生了什么

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

我希望这有帮助

Block.air只是一个对象。将块数组的大部分设置为包含对单个对象的引用,这会导致所有这些元素共享该块对象:

正如您所料,调用setBounds会立即改变原始的Block.air,并且大多数元素都会看到这种变化,因为大多数元素都指向同一个共享的Block.air对象

您需要做的是使块数组的每个元素都有自己的对象。从矩形继承的克隆方法可能是最简单的方法:

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);

你试过在块构造函数中调用超级构造函数吗?
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);