现在我在一个用于收听我的服务器的类中有一个函数,它根据一个管道文件绘制我的游戏地图:
String[] mapSplit = map.split("\\|");
mapWidth = Integer.parseInt(mapSplit[0]);
mapHeight = Integer.parseInt(mapSplit[1]);
String[] groundLayer = mapSplit[2].split(", ");
String[] buildingLayer = mapSplit[3].split(", ");
String[] objectLayer = mapSplit[4].split(", ");
int count = 0;
logger.info("Drawing started.");
for (int x=0; x<mapWidth; x++){
xDraw = 0;
for (int y=0; y<mapHeight; y++){
if (!groundLayer[count].equals("0")){ //don't draw full transparent tiles
SpriteStore.get().getSprite("images/tiles/" + groundLayer[count] + ".png").draw(m.gamePanel.getGraphics(), xDraw, yDraw);
}
if (!buildingLayer[count].equals("0")){ //don't draw full transparent tiles
SpriteStore.get().getSprite("images/tiles/" + buildingLayer[count] + ".png").draw(m.gamePanel.getGraphics(), xDraw, yDraw);
}
if (!objectLayer[count].equals("0")){ //don't draw full transparent tiles
SpriteStore.get().getSprite("images/tiles/" + objectLayer[count] + ".png").draw(m.gamePanel.getGraphics(), xDraw, yDraw);
}
xDraw += 32;
count++;
}
yDraw += 32;
}
logger.info("Drawing done.");
这一切都很好,花花公子。现在我没有游戏循环,因为我正在使用客户端/服务器协议,因此它只绘制一次(当选择字符并完成登录时)。当jpanel所在的jrame被调整大小,或者当我的任何jinternal帧移动到jpanel上时,我的问题就来了。
调整JFrame大小后,整个地图都会消失。
当JInternalFrames在JPanel上移动时,地图将被移除,发生重叠。
我很确定这是因为AWT调用了一个重绘(从我在发布之前看到的一些看法),但我无法得到解决方案。
漂亮我不希望我的JPanel(地图)被清除/删除/编辑,除非我选择更新它。这应该包括,其他组件被拖动,窗口被最小化,另一个(窗口)应用程序覆盖部分/全部JFrame等。任何帮助都将非常感谢。
上面的
^^是我的意思,通过拖动JInternalFrame删除拖动的部分^^
修改 我想发布Stefan Haustein帮我来的解决方案!!!
在我的主要课程中我制作了图片: gamePanelImage = new BufferedImage(gamePanelWidth,gamePanelHeight,BufferedImage.TYPE_INT_ARGB); gamePanel = new MapGamePanel();
在我的服务器命令监听器中:
logger.info("Drawing started.");
for (int x=0; x<mapWidth; x++){
xDraw = 0;
for (int y=0; y<mapHeight; y++){
//m.gamePanel.getGraphics()
if (!groundLayer[count].equals("0")){ //don't draw full transparent tiles
SpriteStore.get().getSprite("images/tiles/" + groundLayer[count] + ".png").draw(MyClient.getGamePanelImage(), xDraw, yDraw);
}
if (!buildingLayer[count].equals("0")){ //don't draw full transparent tiles
SpriteStore.get().getSprite("images/tiles/" + buildingLayer[count] + ".png").draw(MyClient.getGamePanelImage(), xDraw, yDraw);
}
if (!objectLayer[count].equals("0")){ //don't draw full transparent tiles
SpriteStore.get().getSprite("images/tiles/" + objectLayer[count] + ".png").draw(MyClient.getGamePanelImage(), xDraw, yDraw);
}
xDraw += 32;
count++;
}
yDraw += 32;
}
logger.info("Drawing done.");
最后我用来覆盖JPanel的类:
package com.jayavon.game.graphics;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import com.jayavon.game.client.MyClient;
public class MapGamePanel extends JPanel {
private static final long serialVersionUID = 1L;
public MapGamePanel() {
super();
setLayout(new BorderLayout());
setBorder(BorderFactory.createLineBorder(Color.black));
}
protected void paintComponent(Graphics g) {
g.drawImage(MyClient.getGamePanelImage(), 0, 0, null);
}
}
答案 0 :(得分:1)
你是否覆盖绘画(图形)并在绘画(图形)中进行绘图? 如果没有,那可能是问题所在。
请参阅此处的“绘画方法”:http://java.sun.com/products/jfc/tsc/articles/painting/index.html
如果要避免在paint()(或paintComponent())中重新绘制贴图,请在接收服务器数据时将贴图绘制到BufferedImage(使用图像上的getGraphics)。在paint()中只绘制缓冲区图像。