Java 如何在2D图像阵列中存储和显示瓷砖?

Java 如何在2D图像阵列中存储和显示瓷砖?,java,arrays,image,swing,2d,Java,Arrays,Image,Swing,2d,今天我开始用Java做一个2D游戏。我想创建一个(动态的,因为每次启动时地图都不一样)地图,其中有墙(W)、瓷砖(_u)、敌人(E)和玩家(P) 地图如下所示: _ _ E P _ _ E _ _ _ P _ _ _ _ _ _ _ _ _ _ _ _ T _ _ _ _ T _ _ W W W W W T _ _ _ 对应于这个地图,我希望每个字段都有一个图像平铺 例如,每个平铺字段都应该有以下内容 我想拥有一个2D图像数组,但不确定如何存储它并在JFrame中显示它 private

今天我开始用Java做一个2D游戏。我想创建一个(动态的,因为每次启动时地图都不一样)地图,其中有墙(W)、瓷砖(_u)、敌人(E)和玩家(P)

地图如下所示:

_ _ E P _ _ E _ _ _ 
P _ _ _ _ _ _ _ _ _ 
_ _ _ T _ _ _ _ T _ 
_ W W W W W T _ _ _ 
对应于这个地图,我希望每个字段都有一个图像平铺

例如,每个平铺字段都应该有以下内容

我想拥有一个2D图像数组,但不确定如何存储它并在
JFrame
中显示它

private Image[][] imageMap;
for(int i = 0; i < dimensionX; i++)
{
    for(int j = 0; j < dimensionY; j++)
    {
        if(charMap[i][j] == '_'). //string map is the map with characters
        {
            tiles[i][j] = ??? // store the image here
        }
    }
}
private Image[]imageMap;
对于(int i=0;i
我不确定复制图像是否是一种好的做法。通常,当我需要用平铺创建贴图时,我会使用缓冲图像,并在最后将其绘制在JFrame上显示(由于性能差,我不建议直接在JFrame中显示)

因此,我建议创建与JFrame大小相同的BuffereImage:

BufferedImage buffer = new BufferedImage(jframe.getSize());
然后创建带有分幅的缓冲图像,并将其放置为单个分幅:

BufferedImage[] tiles = new BufferedImage[5];
之后,您可以使用循环a绘制缓冲区:

buffer.drawImage(tiles[yourTileNumberInList], i*tileWidth, j*tileHeight, null);
最后,在JFrame中绘制缓冲区

编辑: 要在JFrame中绘制所需内容,可以使用:

void drawInJFrame(JFrame jframe, BufferedImage buffer){
   Graphics2d g2d = (Graphics2D) jframe.getGraphics();
   g2d.drawImage(buffer, 0, 0, null);
   g2d.dispose();
}
当你们想在游戏中使用它并且想要刷新时,你们可能需要使用循环和重绘JFrame

while(true){
   // Yours game logic
   drawInJFrame(jframe, buffer);
}

若你们不想100%使用你们的线程,你们可以限制游戏的帧率

长启动时间;
整数fps=60;//例如,您可以使用另一个帧速率60
while(true){
startTime=System.nanoTime();
//你的游戏逻辑
drawInJFrame(jframe,buffer);
而(System.nanoTime()-startTime<100000000/fps){
试一试{
线程睡眠(01100*1000);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}

这可能是制作游戏最简单的方法,但只适用于基本游戏。这个绘图是由CPU执行的,所以速度很慢。如果你想用GPU方便地绘图,你可以寻找任何游戏库。

你有所有正确的想法。你应该研究用Java绘制BuffereImage。这张地图上面画了什么?如果没有,也许把图像放在
GridLayout
中效果最好。嗨!谢谢你的回答!你能告诉我如何在Jframe中绘制缓冲区吗?当然可以,我会很快编辑我的答案。1)Graphics2d g2d=(Graphics2d)Jframe.getGraphics()从不在GUI组件上调用
getGraphics
。2) 通常,定制一个顶级容器(如
JFrame
)不是一个好主意。最好覆盖
JPanel
paintComponent
方法,然后将其添加到框架(或其他面板)中。3)
Thread.sleep(01100*1000)不要阻止EDT。使用Swing
计时器
,调用更新游戏状态的动作侦听器,然后调用
repaint()