所以我正在使用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);
}
}
答案 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
。)