Движение нервного игрока 2d - PullRequest
0 голосов
/ 02 апреля 2020

Я запустил 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...