我正在制作一个新游戏,它会生成一个巨大的网格(比如说 1000x1000)。玩家从中间开始,四处移动寻找“点”。玩家只能看到窗口中较大网格的一部分 (15x15)。现在我只有一个巨大的矩形数组,每个矩形都绘制我创建的污垢 block 的缓冲图像。问题:我应该使用更好的变量类型来存储所有这些图像吗?
这就是我的 Dirt 类的样子(保存矩形和开始时生成的图像):
public class Dirt extends Spot{
private int index;
public Dirt(int temp){
index = temp;
}
public Image getImageIndex(){return index;}
}
这是我的 Board 类的一部分,它吸引了所有的污垢:
public class Board extends JPanel{
private final int BLOCK_SIZE; //Holds the size of each block
private final int SIZE; //Holds the size of the board
private DirtImages[] imgs_Dirt = new DirtImages[20]; //Holds 20 random dirt images - generated at begtinning
private Spot[][] spots;
public Board(int size, int blocksize){
SIZE = size;
BLOCK_SIZE = blocksize;
//Board
setSize(SIZE,SIZE);
//Timer Label
add(JTimerLabel.getInstance());
//Create 20 random Images of dirt to use for the rest of dirts
for(int i = 0; i < 20; i++){
imgs_Dirt[i] = new DirtImages(new Rectangle(0,0,BLOCK_SIZE,BLOCK_SIZE));
add(imgs_Dirt[i]);
}
//Create Dirt
spots = new Dirt[500][500];
java.util.Random randomGenerator = new java.util.Random();
for(int i = 0; i < spots.length; i++){
for(int j = 0; j < spots.length; j++)
spots[i][j] = new Dirt(randomGenerator.nextInt(20));
}
}
public void paint(Graphics g){
super.paint(g);
Graphics2D g2d = (Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//Draw Grid #First
for(int i = 0; i < spots.length; i++){
for(int j = 0; j < spots.length; j++)
if(spots[i][j] != null)
g2d.drawImage(imgs_Dirt[((Dirt)spots[i][j]).getImageIndex()].getImage(), BLOCK_SIZE*i,BLOCK_SIZE*j,BLOCK_SIZE,BLOCK_SIZE, null);
}
Toolkit.getDefaultToolkit().sync();
g2d.dispose();
requestFocus();
}
只是为了澄清。我创建了 20 个污垢图像,以便污垢(绘制时)看起来不像是平铺的,而是随机的。因此,在我的 Dirt 数组中,每个 Dirt 都指向一个随机图像。
附加问题:现在我创建了巨大的网格,我该如何制作才能让玩家从中心开始并绘制周围的单元格。目前,我从数组左上角的数组开头开始。我应该为每个污垢创建一个 boolean 标志来确定是否应该绘制它吗?
最佳答案
如果你有 1,000,000 个污垢,但只有 20 张图像,那么在每个污垢中存储图像有点浪费。您可以使用索引来代替。所以要画,而不是画
((Dirt)spots[i][j]).getImage()
你会画画
imgsDirt[((Dirt)spots[i][j]).getImageIndex()]
对于更新的问题:
您似乎正在绘制整个网格(0-1000,0-1000)。您真正想要的只是绘制 15x15 的“可见”区域。所以而不是
//Draw Grid #First
for(int i = 0; i < spots.length; i++){
for(int j = 0; j < spots.length; j++)
应该是
//Draw Grid #First
for(int i = player.xpos-7; i < player.xpos+7; i++){
for(int j = player.ypos - 7; j < player.ypos+7; j++)
您需要对您的drawImage方法进行适当的调整,以确保它仍然在窗口的左上角开始绘制。
关于Java Swing 巨大网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9861467/