我有一个名为KeyListenerKeyboard类,该类实现了KeyListener的方法。

键具有四个状态键(UP, ISUP, DOWN, ISDOWN),它们分别表示它们是否已关闭或刚刚关闭。

在每次更新Keyboard之前,我想将所有UP更改为ISUPS,将DOWN更改为ISDOWN

Keyboard类上有一个Update方法,但我不知道何时调用它(因为addKeyListener()函数似乎很神奇,并且无需调用任何函数即可工作[可能启动线程])

我怎么知道何时调用Update方法? (在Keyboard即将触发事件之前)

这是Keyboard类本身:

package game.input;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.HashMap;
import java.util.Map;

enum KeyStatus
{
    DOWN, ISDOWN, UP, ISUP
}

public class Keyboard implements KeyListener
{
    private Map<Character, KeyStatus> keys;

    public Keyboard()
    {
        keys = new HashMap<Character, KeyStatus>();

        for (int i = 0; i < 256; i++)
        {
            keys.put((char)i, KeyStatus.ISUP);
        }
    }

    public void update() //This should be called after every event loop (how?)
    {
        for (Map.Entry<Character, KeyStatus> ks: keys.entrySet())
        {
            if (ks.getValue() == KeyStatus.UP)
                keys.put(ks.getKey(), KeyStatus.ISUP);

            else if (ks.getValue() == KeyStatus.DOWN)
                keys.put(ks.getKey(), KeyStatus.ISDOWN);
        }
    }

    public boolean keyDown(char i)
    {
        return (keys.get(i) == KeyStatus.DOWN || keys.get(i) == KeyStatus.ISDOWN);
    }

    public boolean onKeyDown(char i)
    {
        return (keys.get(i) == KeyStatus.DOWN);
    }

    public boolean keyUp(char i)
    {
        return (keys.get(i) == KeyStatus.UP || keys.get(i) == KeyStatus.ISUP);
    }

    public boolean onKeyUp(char i)
    {
        return (keys.get(i) == KeyStatus.UP);
    }


    @Override
    public void keyPressed(KeyEvent key)
    {
        keys.put(key.getKeyChar(), KeyStatus.DOWN);
    }

    @Override
    public void keyReleased(KeyEvent key)
    {
        keys.put(key.getKeyChar(), KeyStatus.UP);
    }

    @Override
    public void keyTyped(KeyEvent key)
    {
    }

}

最佳答案

KeyListener被注册到组件,当某种EventQueue出现时,KeyEvent会通知该组件。 EventQueue由特定于平台的机制通知,该机制直接绑定到OS /本机层。

对于侦听器,Swing通常使用observer pattern。也就是说,您将侦听器附加到组件,该组件将在发生某些情况时告诉您

您不应该“需要”调用任何方法来检查键的状态。相反,当触发KeyEvent时,将通过事件链通知KeyListener,并通过KeyListener接口触发适当的事件。

KeyListener需要注册一些在屏幕上可见的组件,可以获取键盘焦点并在事件发生时具有焦点。

有关更多详细信息,请参见How to write Key Listeners

您可能还会发现Introduction to Event Listeners有用。

KeyListener存在焦点问题(仅当前可聚焦/聚焦的组件可以接收KeyEvents)。建议您改用Key Bindings

更新

经过一番讨论,我们找出了真正的问题所在,然后得出结论,OP正在尝试生成当前按下但由游戏引擎处理过的按键的屏蔽列表,以消除这种情况。触发更多更新的键重复。

我们得出的结论是,OP应该生成一个“已处理”和“活动”密钥列表。

触发按键事件时,键盘处理程序将检查该键是否在“已处理”列表中,如果存在,则忽略该键,否则将其置于活动列表中。

当游戏引擎处理这些键时,它会扫描“活动”列表,并采取措施并将每个键放在“已处理”列表上。

释放密钥后,会将其从已处理列表中删除。

关于java - Java KeyListener“对象更新”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16430088/

10-11 03:51