Java Swing 巨大网格

标签 java arrays swing grid

我正在制作一个新游戏,它会生成一个巨大的网格(比如说 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/

相关文章:

java - 如何使用游标?

java - 如何从 Android Studio 中的文件夹附加 jar 库的源代码?

Java Calendar.WEEK_OF_YEAR 返回该月中的第几周

arrays - 算法:对于数组的每个元素,找出其左侧小于自身的最大值

java - 如何设置 JRadioButton 的位置?

java - 防止在调整 JButton 的容器大小时调整其大小

java - 不可变数组的修改不起作用

java - (Java) 递归重载遇到问题

java - 更改 JTabbedPane 标题的大小

java - 更改 JTable 中单元格的颜色