gpt4 book ai didi

Java - KeyListener - KeyReleased 有时不触发

转载 作者:太空宇宙 更新时间:2023-11-04 12:28:10 24 4
gpt4 key购买 nike

我正在使用 Java 制作 2D 游戏,并且有一个关键监听器来处理玩家 Action 和其他内容。大多数时候它工作得很好。然而,有时它会出现故障。例如,我将按住“A”键使角色向左移动,当我松开它时,角色会继续移动,就像我仍然按住该键一样。我认为这是因为 key 监听器由于某种原因没有检测到 keyReleased 事件。

我已经尝试找出原因有一段时间了,但仍然不知道为什么会这样做。

如果您想看一下,这是我的代码的一部分。

主要监听器类

package input;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import game.Game;

public class KeyboardInput extends KeyAdapter {
public KeyboardInput() {
}

// Detects pressed keys
public void keyPressed(KeyEvent e) {
if (Game.init) {
Keys.Keys[e.getKeyCode()] = true;
}
}

// Detects released keys
public void keyReleased(KeyEvent e) {
if (Game.init) {
Keys.Keys[e.getKeyCode()] = false;
}
}
}

我的显示类的一部分

 // Display Constructor
public Display(String title, String gameVersion, int width, int height) {
this.title = title;
this.width = width;
this.height = height;
this.gameVersion = gameVersion;

createDisplay();
}

// Creates display
private void createDisplay() {
frame = new JFrame(title + " v. " + gameVersion);
frame.setSize(width, height);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setFocusable(true);

canvas = new Canvas();
canvas.setPreferredSize(new Dimension(width, height));
canvas.setMinimumSize(new Dimension(width, height));
canvas.setMaximumSize(new Dimension(width, height));
canvas.setBackground(Color.WHITE);

frame.add(canvas);
frame.addKeyListener(new KeyboardInput()); // ADDING KEY LISTENER TO THE JFRAME
canvas.addMouseListener(new MouseInput());
frame.pack();
if (frame.getKeyListeners().length > 0) {
System.out.println("Key listener initialized");
} else {
System.out.println("ERROR : Key listener couldn't initialize");
}
if (canvas.getMouseListeners().length > 0) {
System.out.println("Mouse listener initialized");
} else {
System.out.println("ERROR : Mouse listener couldn't initialize");
}
}

// Updates display (called every frame)
public void update() {
frame.requestFocus();
tick++;
lasttime = currtime;
currtime = System.nanoTime();
delta = (currtime - lasttime) / 1000000000;
fps = (float) (1 / delta);
if ((tick / fps) >= SAVE_TIME) {
tick = 0;
saveNextTick = true;
System.out.println("FPS = " + Math.round(getFPS()));
try {
System.out.println("MOUSE POSITION = (" + frame.getMousePosition().getX() + ", "
+ frame.getMousePosition().getY() + ")");
} catch (Exception e) {
System.out.println("Mouse out of screen. Could not get mouse position (NullPointerException)");
}
}

if (saveNextTick) {
Save.saveGame("Save");
saveNextTick = false;
}
}

处理玩家移动的方法

private void checkMove() {
int speed = moveSpeed;
int x1 = getxPos();
int x2 = x1 + getTexture().getImage().getWidth();
int y1 = getyPos();
int y2 = y1 + getTexture().getImage().getHeight();
if ((Keys.Keys[KeyEvent.VK_W] || Keys.Keys[KeyEvent.VK_S]) && (Keys.Keys[KeyEvent.VK_A] || Keys.Keys[KeyEvent.VK_D])) {
speed = diagonalMoveSpeed;
}
int d = Math.max((int) (speed / Display.getFPS()), 1);
if (speed / Display.getFPS() < 1 && Util.randInt(0, 100) > speed / Display.getFPS() * 100) {
d = 0;
}
if (Keys.Keys[KeyEvent.VK_W] && !States.currentState.checkCollision(x1, x2, y1 - d, y2 - d)) {
move(0, -d);
}
if (Keys.Keys[KeyEvent.VK_A] && !States.currentState.checkCollision(x1 - d, x2 - d, y1, y2)) {
move(-d, 0);
}
if (Keys.Keys[KeyEvent.VK_S] && !States.currentState.checkCollision(x1, x2, y1 + d, y2 + d)) {
move(0, d);
}
if (Keys.Keys[KeyEvent.VK_D] && !States.currentState.checkCollision(x1 + d, x2 + d, y1, y2)) {
move(d, 0);
}
}

预先感谢您的帮助。如果您需要查看代码的任何其他部分来找出问题,请询问。

附注:我知道这可能不是编写按键监听器/获取键盘输入的最简单方法,但这是我知道的唯一方法。我目前正在寻找更好的方法,一旦找到我就会更改它。

最佳答案

你应该做一些诸如键盘去抖动之类的事情。因为当我们长时间按下键盘按钮时。因为当我们尝试通过长按键盘按键在编辑器中写入文本时,释放按键后会生成更多字符。

阅读相应的质量检查:
implementing debounce in Java

关于Java - KeyListener - KeyReleased 有时不触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38166795/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com