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

これはすべてうまくてダンディです。現在、クライアント/サーバープロトコルに取り組んでいるため、ゲームループはありません。そのため、描画は 1 回だけです (キャラクターが選択され、ログインが完了したとき)。私の問題は、jpanel が置かれている jframe のサイズが変更されたとき、または jinternal フレームのいずれかが jpanel の上を移動したときに発生します。

JFrame のサイズを変更すると、マップ全体が消えます。

JInternalFrames が JPanel の上に移動されると、オーバーラップが発生した場所でマップが削除されます。

これは、AWT によって呼び出された再描画が原因であると確信しています (ここに投稿する前に行ったいくつかの調査から) が、解決策を得ることができません。

更新することを選択しない限り、JPanel(マップ)をクリア/消去/編集したくありません。これには、ドラッグされている他のコンポーネント、最小化されているウィンドウ、JFrame の一部またはすべてをカバーする別の (Windows) アプリケーションなどを含める必要があります。

マップを覆い隠す JInternalFrame

^^上記は、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);
    }
}
4

1 に答える 1

1

Paint(Graphics) をオーバーライドして Paint(Graphics) で描画しますか? そうでない場合は、おそらくそれが問題です。

http://java.sun.com/products/jfc/tsc/articles/painting/index.htmlの「The Paint Method」を参照してください。

paint() (または paintComponent()) でマップを再描画することを避けたい場合は、サーバー データを受信するときに、(画像で getGraphics を使用して) BufferedImage にマップを描画します。paint() では、バッファ イメージを描画するだけです。

于 2012-06-17T23:05:05.637 に答える