Я делаю игру, и я использую delta для контроля скорости игры. Но по какой-то причине, если игрок удерживает клавишу слишком долго, лицо лианы будет двигаться слишком быстро! Может кто-нибудь, пожалуйста, помогите мне?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);
}
}
}
Это вообще связано с операционной системой, повторяющей удерживаемый ключ снова и снова? – ryanyuyu
@ryanyuyu Что значит удерживаемый ключ? Если вы имели в виду, что операционная система не изменит wPressed boolean от true до false, это не так. Дельта кажется слишком высокой, или что-то еще. Основная проблема заключается в том, что всякий раз, когда я использую дельту для перемещения изображения, если кнопка W удерживается, изображение начинает двигаться быстрее, чем земля вращается вокруг Солнца. –
@ MehmetM.Inanc Рефакторинг кода обработки времени и событий в класс creeperupdate? Как в move getTime() getDelta() и слушатели клавиатуры? –