java - 在 Java 游戏中,按下一个键会取消仍然按下的另一个键

标签 java swing sprite paintcomponent keylistener

我正在用 java 制作 2D 游戏。

在游戏中,按左右箭头键可旋转 Sprite 并操纵名为“角度”的变量。按向上箭头键,根据“角度”变量计算 Sprite 应该移动的方向。

这可行,但我无法在移动时操纵角度,也就是在按下向上箭头的同时按下左键或右键。

按向上箭头会使程序忽略按下箭头键之一的事实。

我搜索了论坛并找到了一个如何处理该问题的建议,但我不确定它是否最适合我的程序。 (我发现了什么:How do I handle simultaneous key presses in Java?)

这是一些代码:

Thing类的相关方法:

    public void keyPressed(KeyEvent e){

    int key = e.getKeyCode();

    if(key==KeyEvent.VK_LEFT){ setAngle(getAngle()-5); 
            leftPressed=true; // *new* }
    if(key==KeyEvent.VK_RIGHT)setAngle(getAngle()+5);{
            rightPressed=true; // *new* }
    if(key==KeyEvent.VK_UP){

        dy = (float) ( Math.sin( getAngle() ) ) * 5;
        dx = (float) ( Math.sin( 90-getAngle() ) ) * 5;
                    if(leftPressed==true)angle-=5; // *new*
        if(rightPressed==true)angle+=5; // *new*

    }

public void move(){
    x += dx;
    y += dy;
}

}

Board类(管理游戏的类:)

打包learningMovement;

import java.util.*;
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.Timer;

public class Board extends JPanel implements ActionListener, KeyListener {

    Thing t;

    Timer timer;

    public Board(){
        setBackground(Color.BLACK);
        timer = new Timer(10,this);
        t = new Thing();
        setFocusable(true);
        timer.start();
        addKeyListener(this);
    }

    public void paintComponent(Graphics g)
    {

        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;

        g2d.rotate( Math.toRadians(t.getAngle()), t.getX() + (t.getWidth()/2), t.getY() + (t.getHeight()/2) );
        g2d.drawImage(t.getImage(),(int)t.getX(),(int)t.getY(),this);

    }

    public void actionPerformed(ActionEvent e){

        t.move();
        repaint();

    }

    public void keyPressed(KeyEvent e) {

        int key = e.getKeyCode();

        if(key==KeyEvent.VK_LEFT)t.keyPressed(e);
        if(key==KeyEvent.VK_RIGHT)t.keyPressed(e);
        if(key==KeyEvent.VK_UP)t.keyPressed(e);

    }

    public void keyReleased(KeyEvent e) {

        int key = e.getKeyCode();

        if(key==KeyEvent.VK_LEFT)t.keyReleased(e);
        if(key==KeyEvent.VK_RIGHT)t.keyReleased(e);
        if(key==KeyEvent.VK_UP)t.keyReleased(e);

    }

    public void keyTyped(KeyEvent arg0) {}



}

我该如何解决这个问题?谢谢

最佳答案

KeyListener 只会引发一个事件。这意味着,每当 keyPressed 被调用时,它代表一个单一的按键事件。

相反,您需要做的是,在每次触发 keyPressed 时,您需要设置一个标志,指示按下了哪个键。当keyReleased被触发时,需要重新设置flag。

然后您需要一种方法来处理这些标志并根据这些标志的状态决定要做什么...

最后避免 KeyListener,这是一个很难处理的焦点问题。相反,我建议您使用 Key Bindings相反

例如……

关于java - 在 Java 游戏中,按下一个键会取消仍然按下的另一个键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20867279/

相关文章:

java - 比较 Composer 名称,或者如何找到两个字符串之间的 'close enough' 匹配项?

java - CRudRepository native 查询无法返回结果集

java - 使用函数将文本设置为 Jlabel

java - MigLayout,禁用 JButton 宽度调整大小

java - 在java中切换值

c++ - 在 C++ 中计算 Sprite 的坐标

java - Spring Integration 一直消耗更多内存

java - 我需要在JAVA中使用中断方法的实际情况是什么?

CSS Sprite 不起作用

Swift SpriteKit 将计时器添加到 GameScene