0

现在我有一个函数,在一个用于监听我的服务器的类中,它根据管道文件绘制我的游戏地图:

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.");

这一切都很好,花花公子。Right now I don't have a gameloop as I am working on a client/server protocol so it only draws once(when the character is selected and login is done). 当 jpanel 所在的 jrame 被调整大小时,或者当我的任何 jinternal 框架在 jpanel 上移动时,我的问题就出现了。

当 JFrame 调整大小时,整个地图就会消失。

当 JInternalFrames 在 JPanel 上移动时,地图会在发生重叠的位置被移除。

我很确定这是由于 AWT 调用了重绘(从我在此处发布之前所做的一些环顾四周),但我无法获得解决方案。

除非我选择更新它,否则我几乎不希望我的 JPanel(map) 被清除/擦除/编辑。这应该包括在其上拖动其他组件、最小化窗口、覆盖部分/全部 JFrame 的另一个(窗口)应用程序等。对此的任何帮助将不胜感激。

JInternalFrame 遮挡地图

^^上面是一个例子,我的意思是拖动 JInternalFrame 会删除你拖动的部分^^

编辑 我想发布 Stefan Haustein 帮助我找到的解决方案!!!

在我的主课中,我制作了图像: gamePanelImage = new BufferedImage(gamePanelWidth, gamePanelHeight, BufferedImage.TYPE_INT_ARGB); 游戏面板 = 新地图游戏面板();

在我的服务器命令侦听器中:

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);
    }
}
4

1 回答 1

1

您是否覆盖绘画(图形)并在绘画(图形)中进行绘图?如果不是,那可能就是问题所在。

请参阅此处的“绘制方法”:http: //java.sun.com/products/jfc/tsc/articles/painting/index.html

如果您想避免在paint()(或paintComponent())中重新绘制地图,请在收到服务器数据时将地图绘制到BufferedImage(在图像上使用getGraphics)。在paint() 中,只需绘制您的缓冲图像。

于 2012-06-17T23:05:05.637 回答