jpanel графика, чтобы не перекрасить при изменении размера и т. д.
Прямо сейчас у меня есть функция в классе, которая используется для прослушивания моего сервера, которая рисует мою игровую карту на основе переданного по трубопроводу файла:
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.");
Это все хорошо и денди. Прямо сейчас у меня нет игрового цикла, так как я работаю над протоколом клиент / сервер, поэтому он рисует только один раз (когда персонаж выбран и логин завершен). Моя проблема возникает, когда размер jrael, в котором находится jpanel, изменяется, или когда любой из моих jinternal кадров перемещается по jpanel.
При изменении размера JFrame вся карта исчезает.
Когда JInternalFrames перемещаются по JPanel, карта удаляется там, где происходит наложение.
Я почти уверен, что это происходит из-за перекраски, вызванной AWT(из-за того, что я огляделся вокруг, что я делал до публикации здесь), но я не могу найти решение.
Довольно, я не хочу, чтобы моя JPanel(карта) была очищена / стерта / отредактирована, если я не решу ее обновить. Это должно включать перетаскивание других компонентов, сворачивание окна, другое (оконное) приложение, покрывающее часть / весь JFrame и т. Д. Любая помощь с этим будет принята с благодарностью.
^^ выше - пример того, что я имел в виду, перетаскивая JInternalFrame, удаляет части, которые вы перетаскиваете через ^^
РЕДАКТИРОВАТЬ Я хотел опубликовать свое решение, которое Стефан Хаустейн помог мне прийти!!!
в моем основном классе я сделал изображение: 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);
}
}
1 ответ
Вы перекрываете рисование (Графика) и делаете ли рисование краской (Графика)? Если нет, то это, вероятно, проблема.
См. "Метод рисования" здесь: http://java.sun.com/products/jfc/tsc/articles/painting/index.html
Если вы хотите избежать перерисовки карты в paint () (или paintComponent ()), нарисуйте карту в BufferedImage (используя getGraphics на изображении), когда вы получите данные сервера. В paint () просто нарисуйте буферное изображение.