Я запустил 2d нисходящую игру в Java, все работает, кроме движения игрока. Игрок движется правильно, но когда я держу его, скажем, D (справа), игрок идет вправо, но в течение первой секунды движения он дрожит (отстает), а затем начинает плавно двигаться. Я видел сообщения, похожие на мой вопрос, и сделал то, что они сделали, но все равно не работает.
PlayerKeys. java:
public class PlayerKeys implements KeyListener {
Player player;
public PlayerKeys(Player player){
this.player = player;
}
public void keyTyped(KeyEvent keyEvent) {
}
public void keyPressed(KeyEvent keyEvent) {
int code = keyEvent.getKeyCode();
switch(code){
case KeyEvent.VK_W: player.goUp = true; break;
case KeyEvent.VK_S: player.goDown = true; break;
case KeyEvent.VK_A: player.goLeft = true; break;
case KeyEvent.VK_D: player.goRight = true; break;
default: break;
}
}
public void keyReleased(KeyEvent keyEvent) {
int code = keyEvent.getKeyCode();
switch(code){
case KeyEvent.VK_W: player.goUp = false; break;
case KeyEvent.VK_S: player.goDown = false; break;
case KeyEvent.VK_A: player.goLeft = false; break;
case KeyEvent.VK_D: player.goRight = false; break;
default: break;
}
}
}
Player.update (метод который перемещает игрока):
public void update(){
if(goUp && !goDown) velocity.y = -speed;
else if(goDown && !goUp ) velocity.y = speed;
else velocity.y = 0;
if(goRight && !goLeft ) velocity.x = speed;
else if(goLeft && !goRight) velocity.x = -speed;
else velocity.x = 0;
x += velocity.x;
y += velocity.y;
}
Обновление темы (обновление l oop):
public class UpdateThread extends Thread{
public UpdateThread(){}
public float targetUPS = 60;
public boolean running = true;
public void run(){
long lastTime = System.nanoTime();
final double amountOfTicks = targetUPS;
double ns = 1000000000 / amountOfTicks;
double delta = 0;
int updates = 0;
long timer = System.currentTimeMillis();
while(running){
long now = System.nanoTime();
delta += (now - lastTime) / ns;
lastTime = now;
if(delta >= 1){
tick();
updates++;
delta--;
}
if(System.currentTimeMillis() - timer > 1000){
timer += 1000;
//System.out.println("UPS: "+updates);
updates = 0;
}
}
}
private void tick(){
Main.player.update();
}
}
Видео: https://www.dropbox.com/s/hvxlsdpj3pp44fs/jittery-movement.mp4?dl=0 (наибольшие задержки = 0 : 01, 0:07, 0:10)
ОБНОВЛЕНИЕ: Я установил целевую частоту кадров при рисовании для l oop (аналогично обновлению l oop, но это dr aws) до 2000 кадров в секунду и дрожание / отставание исчезли, но я хочу ограничить частоту кадров до 60 кадров в секунду, потому что я хочу, чтобы эта игра работала на «картошке», которая не может превышать 1000 кадров в секунду. Таким образом, проблема, кажется, в рисовании / рендеринге. Я также пробовал StrategyBuffer, но он все еще дает тот же результат: /
DrawThread (ничья l oop):
public class DrawThread extends Thread {
private JFrame window;
public DrawThread(JFrame window){
this.window = window;
}
public float targetFPS = 60;
public boolean running = true;
public void run(){
long lastTime = System.nanoTime();
final double amountOfTicks = targetFPS;
double ns = 1000000000 / amountOfTicks;
double delta = 0;
int frames = 0;
long timer = System.currentTimeMillis();
while(running){
long now = System.nanoTime();
delta += (now - lastTime) / ns;
lastTime = now;
if(delta >= 1){
draw();
frames++;
delta--;
}
if(System.currentTimeMillis() - timer > 1000){
timer += 1000;
//System.out.println("FPS: "+frames);
frames = 0;
}
}
}
private void draw(){
BufferStrategy bs = window.getBufferStrategy();
if(bs == null){
window.createBufferStrategy(3);
return;
}
Graphics g = bs.getDrawGraphics();
g.setColor(Color.WHITE);
g.fillRect(0,0,window.getWidth(), window.getHeight()); // clear screen
Main.player.draw(g); // draw player
g.dispose();
bs.show();
}
}