我试图设置这些矩形的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);
}
答案 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对象:
正如您所料,调用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);