0

これらの長方形の 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);
}

}

ブロッククラス:

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

}
4

2 に答える 2

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 を再インスタンス化するわけではありません。1 つのインスタンスで十分です。そして、[x][y] 表記を使用せずに値を変更できるように、「ホルダー」変数を使用して配列に入る値を保持します。その表記法に問題はありませんが、println() ステートメントでは面倒でした。最後に、各ブロックの内容を順番に出力します。これは、値が実際に正しく初期化されていることを示しているはずです。

これを実行するとき、block[][] 配列のサイズをおそらく 10x10 に減らすことを検討するかもしれません。何が起こっているのかを理解するまで。

初期化時にすべてのブロックが適切に出力される場合は、何かが間違っていることを示しており、配列の内容を表示しているコードの部分に問題があることを示しています。(含めませんでした)。

これが役立つことを願っています。

于 2014-12-18T03:12:16.713 に答える
0

Block.air is just one object. You are setting most of your block array to contain references to that single object, which causes all of those elements to share that Block object:

Array elements pointing to Block.air

As you might expect, then, calling setBounds immediately alters the original Block.air, and most of the elements see that change (since most of the elements point to the same shared Block.air object).

What you need to do is make each element of your block array its own object. The clone() method inherited from Rectangle is probably the easiest way:

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);
于 2014-12-18T03:26:01.427 に答える