如何在JPanel中移动图形的位置

时间:2017-02-09 14:04:06

标签: java swing jpanel

所以我正在使用Javax.swing库为我的单一课程创建游戏。 我创建了一个窗口,并且我已成功编写代码以程序生成游戏地图。

但是,我无法更改地图的焦点。我的意思是地图总是卡在屏幕的一角。 (IE:位置设置为0,0,因此图形g(地图)放在该位置向外。)

我希望能够移动“相机”,以便玩家可以查看地图的不同区域。

Bellow我已粘贴了将地图绘制到屏幕上的方法。任何人都可以告诉我如何让相机在运行时移动。 AKA:向左或向右移动地图。

我想过拥有一个将持有地图的Graphics对象,然后我只绘制该Graphics对象的subImage,但考虑每帧如何重绘地图(为了动画目的)这只意味着我将有更多的图形重绘。 地图是6,400 * 6,400像素

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    try {
        for(int x = 0; x < OverworldMap.MAP_X_SIZE; x++){
            for(int y = 0; y < OverworldMap.MAP_Y_SIZE; y++){
                for(int layer = 0; layer < OverworldMap.MAP_LAYER_SIZE; layer++) {
                    g.drawImage(OverworldMap.getTileAt(x, y, layer).getSprite(), x * SPRITE_SIZE, y * SPRITE_SIZE, null);

                }
            }
        }
    } catch (Exception e) {
        LauncherClass.printErrorLog(e);
    }
}

2 个答案:

答案 0 :(得分:2)

解决此问题的最佳/最简单方法是在JPanel周围放置一个JScrollPane,并使JPanel成为图像的大小。您不必担心只重新绘制图像的正确部分 - Java非常聪明,只能绘制屏幕上的部分。请注意,您可以显示或隐藏ScrollBars,但如果您隐藏它们,则需要添加逻辑以激活滚动浏览其他机制

答案 1 :(得分:0)

您无法存储Graphics对象并在以后使用它。它仅在传递给它的paint方法的持续时间内有效。

然而,您可以简单地抵消您的绘画:

Image sprite = OverworldMap.getTileAt(x, y, layer).getSprite();
g.drawImage(sprite, x * SPRITE_SIZE - playerX, y * SPRITE_SIZE - playerY, this);

(请注意,drawImage的最后一个参数应为this。)