hi zusamm'n
mein sokoban-clone hat eine eigene engine.
über die normale GameView können Overlays hinzugefügt werden, welche von der engine anschliessend mitgezeichnet werden.
das eine overlay zeigt z.b. infos zum level, spielzeit, bewegungen usw. an.
genau hier findet sich mein problem.
das overlay muss immer wieder neu gezeichnet werden, da die spielzeit ja kontinuierlich steigt (ausser während der spielpause
)
bis anhin habe ich im overlay selbst einen thread erstellt, welcher das overlay neu zeichnen lässt.
trotz des eingefügten clippings geht die performance mehr oder weniger runter, wenn der benutzer die spielfigur bewegt (was mich eigentlich nicht wundert... da ja so bis zu 3 repaints in einer halben sekunde gemacht werden)
habe ich das clipping falsch eingesetzt oder gibt es hierfür eine bessere lösung?
danke & cheers
m@nu
mein sokoban-clone hat eine eigene engine.
über die normale GameView können Overlays hinzugefügt werden, welche von der engine anschliessend mitgezeichnet werden.
das eine overlay zeigt z.b. infos zum level, spielzeit, bewegungen usw. an.
genau hier findet sich mein problem.
das overlay muss immer wieder neu gezeichnet werden, da die spielzeit ja kontinuierlich steigt (ausser während der spielpause
bis anhin habe ich im overlay selbst einen thread erstellt, welcher das overlay neu zeichnen lässt.
Code:
private void initThread() {
repaintThread = new Thread(new Runnable() {
public void run() {
while(true) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
gameController.repaintGameView();
}
}
});
repaintThread.start();
}
public void paintOverlay(Graphics g) {
String level = "Level: " + gameData.getLevelNumber();
String time = statistics.getFormattedElapsedTime();
String moves = "Moves: " + statistics.getMoves() + "/" + statistics.getPushes();
String box = "Fertig: " + statistics.getBoxPercentage() + " (" + statistics.getBoxStatus() + ")";
int oldW = g.getClipWidth();
int oldH = g.getClipHeight();
int oldX = g.getClipX();
int oldY = g.getClipY();
g.setClip(0, 0, canvasWidth, 13);
NovaBitmapFont.getInstance().drawString(g, level, 5, 5);
int width = NovaBitmapFont.getInstance().calcStringWidth(time);
NovaBitmapFont.getInstance().drawString(g, time, canvasWidth - width - 5, 5);
g.setClip(0, canvasHeight-13, canvasWidth, 13);
NovaBitmapFont.getInstance().drawString(g, moves, 5, canvasHeight - 13);
width = NovaBitmapFont.getInstance().calcStringWidth(box);
NovaBitmapFont.getInstance().drawString(g, box, canvasWidth - width - 5, canvasHeight - 13);
g.setClip(oldX, oldY, oldW, oldH);
if(repaintThread == null) initThread();
}
trotz des eingefügten clippings geht die performance mehr oder weniger runter, wenn der benutzer die spielfigur bewegt (was mich eigentlich nicht wundert... da ja so bis zu 3 repaints in einer halben sekunde gemacht werden)
habe ich das clipping falsch eingesetzt oder gibt es hierfür eine bessere lösung?
danke & cheers
m@nu