Ostatnio próbuję na zaliczenie na studiach zrobić grę opartą na mapie na Hexcellsach.
Jak na razie mam zrobiony interfejs do edycji map oraz generowanie + edytowanie pól na mapie.
Mapa jest generowana jako Bitmapa a potem nanoszona na obiekt Canvas umieszczony w JScrollPane gdyż czasem nie mieści się ona na ekranie.
Kod wygląda tak:
(Panel Main to JScrollPanel)
// ----------------------------------------------------------------------------------------------------
public static void drawField() {
mapFields.draw(); // kod generowania bitmapy
drawInBackground();
}
// ----------------------------------------------------------------------------------------------------
public static void drawInBackground() {
Thread drawThread = new Thread( new Runnable() {
public void run() { while (true) {
panelMain.setSize( panelMain.getSize().width , panelMain.getSize().height );
canvas.setSize(
max( panelMain.getWidth(), mapFields.getDrawWidth() ),
max( panelMain.getHeight(), mapFields.getDrawHeight() )
);
Graphics2D paintCanvas = (Graphics2D) canvas.getGraphics();
paintCanvas.drawImage(mapFields.getBitmap(), 0, 0, ImageObserver);
} }
});
drawThread.start();
}
// ====================================================================================================
Draw in background musi działać dlatego, że po samym wyrysowaniu bitmapy na Canvas, ona po prostu znika (czyli przekopiowanie kodu z Thread'a do procedury drawField i nie zapętlenie go), a kolejny powód dla którego jest to w wątku to używanie scrollbarów z JScrollPanel.
Zapytacie więc, jaki jest problem?
Problem wygląda niestety tak:
Podczas używanie ScrollBarów, przesuwa się cały Canvas po obszarze okna i nie aktualizuje się, dopiero po próbie zmiany rozmiaru okna, Canvas wraca do JScrollPanela i rysuje ten fragment który jest akurat widoczny.