Ich habe in einigen anderen einfachen 2D-Spielen gesehen, dass eine "Tick" -Methode verwendet wird, um Spielelogik und Grafik-Rendering zu synchronisieren. Mein Hauptgrund für die Verwendung ist eine Fehlfunktion meiner Kollisionserkennung, da die Player-Entität vollständig durch feste Objekte läuft, es sei denn, ich tippe fast pixelweise auf die Steuerelemente, um die Rechtecke zu kollidieren.
Ich gehe davon aus, dass eine Tick-Methode die schnelle Aktualisierung der Spiele so verlangsamt, dass diese leichten Kollisionserkennungen erfasst werden.
Wie erstelle ich eine solche Methode? Ich habe den Code ausprobiert, den Sie unten sehen können. Er führt jedoch dazu, dass das gesamte Spiel einfriert:
Die Aktualisierungsmethode:
@Override
public void update(float deltaTime) {
List<TouchEvent> touchEvents = game.getInput().getTouchEvents();
long lastTime = 0;
long currentTime = 0;
if (state == GameState.Ready) {
updateReady(touchEvents);
}
while (state == GameState.Running) {
lastTime = currentTime;
currentTime = System.currentTimeMillis();
deltaTime = currentTime - lastTime;
player.update(touchEvents, deltaTime);
repaint(deltaTime);
}
if (state == GameState.Paused) {
updatePaused(touchEvents);
}
if (state == GameState.GameOver) {
updateGameOver(touchEvents);
}
}
Die Repaint-Methode, die aktualisiert wird, während die reguläre Paint-Methode nichts bewirkt. Ich habe die while-Schleife mit beiden ausprobiert, scheint nicht aufzuhören zu frieren:
public void repaint(float deltaTime) {
Graphics g = game.getGraphics();
if(deltaTime >= 60) {
g.drawRect(0, 0, 805, 485, color.black);
map.loadMap(getXScroll(), getYScroll(), g, game);
map.loadEntities(getXScroll(), getYScroll(), g, game, map);
g.drawImage(Assets.bitSoldier, 448, 256);
g.drawImage(Assets.dpad, 0, 280);
// Secondly, draw the UI above the game elements.
if (state == GameState.Ready)
drawReadyUI();
if (state == GameState.Running)
drawRunningUI();
if (state == GameState.Paused)
drawPausedUI();
if (state == GameState.GameOver)
drawGameOverUI();
}
}