現在、サーバーをリッスンするために使用されるクラスに、パイプされたファイルに基づいてゲーム マップを描画する関数があります。
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.");
これはすべてうまくてダンディです。現在、クライアント/サーバープロトコルに取り組んでいるため、ゲームループはありません。そのため、描画は 1 回だけです (キャラクターが選択され、ログインが完了したとき)。私の問題は、jpanel が置かれている jframe のサイズが変更されたとき、または jinternal フレームのいずれかが jpanel の上を移動したときに発生します。
JFrame のサイズを変更すると、マップ全体が消えます。
JInternalFrames が JPanel の上に移動されると、オーバーラップが発生した場所でマップが削除されます。
これは、AWT によって呼び出された再描画が原因であると確信しています (ここに投稿する前に行ったいくつかの調査から) が、解決策を得ることができません。
更新することを選択しない限り、JPanel(マップ)をクリア/消去/編集したくありません。これには、ドラッグされている他のコンポーネント、最小化されているウィンドウ、JFrame の一部またはすべてをカバーする別の (Windows) アプリケーションなどを含める必要があります。
^^上記は、JInternalFrame をドラッグすると、ドラッグした部分が削除されるという意味の例です^^
編集 Stefan Hausstein が私を助けてくれた解決策を投稿したかった!!!
メインクラスで画像を作成しました: 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);
}
}