É o meu código de loop do jogo:
public void run() {
running = true;
boolean renderCheck = false;
double firstTime = 0;
double lastTime = System.nanoTime() / 1000000000.0;
double passedTime = 0;
double unprocessedTime = 0;
double frameTime = 0;
int frames = 0;
int fps = 0;
while (running) {
firstTime = System.nanoTime() / 1000000000.0;
passedTime = firstTime - lastTime;
lastTime = firstTime;
unprocessedTime += passedTime;
frameTime += passedTime;
while (unprocessedTime >= UPDATE_CAP) {
tick();
unprocessedTime -= UPDATE_CAP;
renderCheck = true;
}
if (frameTime >= 1.0) {
frameTime = 0;
fps = frames;
frames = 0;
System.out.println(fps);
}
if (renderCheck) {
render();
frames++;
renderCheck = false;
} else {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
É uma zona de render:
private void render() {
BufferStrategy bs = this.getBufferStrategy();
if (bs == null) {
this.createBufferStrategy(3);
return;
}
Graphics graphics = bs.getDrawGraphics();
graphics.setColor(Color.black);
graphics.fillRect(0, 0, WIDTH, HEIGHT);
handler.render(graphics);
graphics.dispose();
bs.show();
}
E aqui está uma parte carrapato (não é necessário mostrar outro código de manipulador porque vai ser tanta coisa para ler):
private void tick() {
handler.tick();
}
Assim, o principal problema é na próxima coisa. Ao pressionar o botão de meu caráter tem que começar a se mover. E, na verdade, ele faz, mas com alguns atrasos que tornam este processo de olhar terrível. Que depois de um segundo, tudo está indo perfeitamente. (Eu já verifiquei a carga da CPU - tudo correr normal)
Este problema está acontecendo apenas no linux PC. Eu verifiquei-lo no Windows 10 em formato exe e tudo estava funcionando bem! Isso é um pouco estranho.
Soo, finalmente eu encontrei uma solução para corrigir esse problema!
Basta configurar propriedades do sistema para Java2D em seu método principal estático escrevendo este código:
public static void main(String argsp[]) {
System.setProperty("sun.java2d.opengl", "true");
new Game();
}