Delta 变得太快了

Delta gets too fast

我正在制作游戏,我正在使用 delta 进行游戏速度监控。但出于某种原因,如果玩家按住按键的时间过长,苦力怕的脸就会移动得太快!有人可以帮我吗?

package net.trenterprises;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;

import net.trenterprises.frame.MainFrame;
import net.trenterprises.frame.Window;

public class Main implements KeyListener {

static boolean wPressed = false;
public static boolean isWPressed() {
    synchronized (Main.class) {
        return wPressed;
    }
}

static int creeperX = 0;
static int creeperY = 0;
static JLabel Creeper = null;

static long lastFrame;

public static long getTime() {
    return (System.nanoTime() * 1000) / 1000000;
}

public static int getDelta() {
    long time = getTime();
    int delta = (int) (time - lastFrame);
    lastFrame = time;
    return delta;
}

static Main Main = new Main();

public static void main(String[] args) {
    Window Frame = new MainFrame();
    Frame.addKeyListener(Main);
    Frame.setLayout(null);
    Frame.setVisible(true);
    Frame.setSize(1380, 750);
    try {
        Creeper = new JLabel(new ImageIcon(ImageIO.read(new URL("https://slm-assets0.secondlife.com/assets/8754271/lightbox/creeper_head2.jpg?1384657553"))));
        Frame.add(Creeper);
        Creeper.setSize(Creeper.getPreferredSize());
        Creeper.setBounds(creeperX, creeperY, Creeper.getSize().width, Creeper.getSize().height);
    } catch (Exception e) {
        e.printStackTrace();
    }
    new CreeperUpdate().start();

}

@Override
public void keyTyped(KeyEvent e) {

}

@Override
public void keyPressed(KeyEvent e) {
    if(e.getKeyChar() == 'w') {
        wPressed = true;
    }
}

@Override
public void keyReleased(KeyEvent e) {
    if(e.getKeyChar() == 'w') {
        wPressed = false;
    }
}

}

class CreeperUpdate extends Thread implements Runnable {
public void run() {
    while(true) {
        if(Main.wPressed) {
            if(Main.getDelta() > 0) {
                System.out.println("Creeper X: " + Main.creeperX);
                Main.creeperX += 1 * (Main.getDelta() / 50);
            }
        }
        Main.Creeper.setBounds(Main.creeperX, Main.creeperY, Main.Creeper.getSize().width, Main.Creeper.getSize().height);
    }
}
}

return (System.nanoTime() * 1000) / 1000000;这与您的除数 50 相比是不是太高了。这就像每秒很多像素,即 2e4。

请不要过度使用常量,如果根本不用,请改用命名变量。

public static final int PIXELS_PER_SECOND = 100

此规则始终适用于朋友陪伴的软件;假设。在您的情况下,如果您将 multipliers/divisors 更改为变量等,这将使您的游戏更容易调整,并可能在以后增加几个难度级别。

并且请将时间和事件处理代码重构到 CreeperUpdate class。将状态推送到需要它的 Thread ,并发很难,如果可以的话最好避免它。静态方法通常很好,无论如何在你的情况下,如果它们不扰乱状态。

对不起,如果这太多了。