Java 当同时按住多个键时,输入处理完全中断

Java 当同时按住多个键时,输入处理完全中断,java,arrays,input,libgdx,Java,Arrays,Input,Libgdx,我对处理heldKeys变量的方式有一些怀疑(从中添加和删除keycodes) 当一次只按下一个键时,一切都很好(这就是为什么我相信这个问题,但是在这个类中,而不是那些负责绘图或更新的类中)。然而,当我同时按下多个键时,一切都会完全中断 通过“中断”,它不再正常工作:按“向上”有时会将所有订阅者向上移动,其他时间会将应该向上移动的订阅者向上移动,其他时间会向下移动,等等。其他时间,某个操作会停止执行任何操作,直到我重新启动程序 我试过调试并看到了heldKeys数组的发展,但我真的不知道问题出在

我对处理
heldKeys
变量的方式有一些怀疑(从中添加和删除
keycodes

当一次只按下一个键时,一切都很好(这就是为什么我相信这个问题,但是在这个类中,而不是那些负责绘图或更新的类中)。然而,当我同时按下多个键时,一切都会完全中断

通过“中断”,它不再正常工作:按“向上”有时会将所有订阅者向上移动,其他时间会将应该向上移动的订阅者向上移动,其他时间会向下移动,等等。其他时间,某个操作会停止执行任何操作,直到我重新启动程序

我试过调试并看到了
heldKeys
数组的发展,但我真的不知道问题出在哪里

代码:

公共类MainInputProcessor实现InputProcessor{
//参考:
// 
私有数组racketMovementListeners;
//存储按下的键
私人IntArray直升机;
//初始化
公共MainInputProcessor(){
heldKeys=新的IntArray();
racketMovementListeners=新数组();
}
//将RacketMovementListener添加到相应的订户列表中
public void subscribeToracketmove(RacketMovementListener新闻订阅器、ObjectMap移动键){
ObjectMap=newObjectMap();
map.put(newSubscriber、movementkey);
racketMovementListeners.add(map);
}
//更新并执行事件操作
public void updateEvents(){
//如果按键匹配,则触发球拍移动订户的事件
如果(!heldKeys.isEmpty()){
for(ObjectMap映射:racketMovementListeners){
for(RacketMovementListener侦听器:map.keys()){
for(整数键码:heldKeys.items){
if(map.get(listener).get(Racket.ACTIONS.MOVE_DOWN).equals(keycode)){
listener.moveDownPressed(listener);
}if(map.get(listener).get(Racket.ACTIONS.MOVE_UP).equals(keycode)){
listener.moveUpPressed(listener);
}
}
}
}
}
}
@凌驾
公共布尔键关闭(int-keycode){
//如果heldKeys不存在,则将keycode添加到heldKeys
如果(!heldKeys.contains(keycode)){
heldKeys.add(键码);
返回true;
}
返回false;
}
@凌驾
公共布尔键控(int-keycode){
//从直升机上移除钥匙代码,因为钥匙不再被按住
for(整数代码:heldKeys.items){
if(code==keycode){
heldKeys.removeValue(代码);
}
}
返回true;
}
我并不是真的在寻找解决方案或固定代码,只是寻找一些起点或某个地方,因为我甚至不知道从哪里开始。我曾想过重写这个,但我想我也会犯同样的错误

对于上下文,这是LibGDX中Pong克隆的代码

更新

我重写了整个输入管理器,以执行完全相同的操作,但使用了switch语句,并以更简单的方式进行了总体操作,但仍然存在完全相同的问题

我现在确定问题出在我处理
heldKeys
数组的方式上。
但是,我仍然无法找出它的问题…

当您按下或释放多个键时,heldKeys阵列中会发生什么情况?@LuisFernandoFrontanilla当我按下多个键时,两个键都会添加到阵列中。但是,经过一点调试,我发现当我释放这两个键时,阵列中只有一个被移除,所以这就像是按键仍然被按住…我仍然不知道如何修复它,因为清除阵列由于某种原因不起作用?我知道这可能是一个很糟糕的解决方法,但你可以尝试使用一些布尔函数来跟踪按下的内容和现在不按下的内容,直到有人回答或者你想出了一个解决方案,这不是一个糟糕的工作这就是你必须要做的。使用布尔值,例如:
moveUp=false;
。如果用户按W键,将其设置为true,然后在其他地方检查
If(moveUp)applyForce to player
,如果玩家释放键,则设置为false。这比始终在数组中搜索现在释放的键更容易处理和更快。当按下或释放多个键时,heldKeys数组中会发生什么情况?@LuisFernandoFrontanilla当我按下多个键时,两个键都会添加到数组。但是,经过一点调试后,我发现当我释放这两个键时,只有一个键从数组中被移除,所以好像键仍然被按住…我仍然不知道如何修复它,因为清除数组由于某种原因不起作用?我知道这可能是一个很糟糕的解决方法,但你可以尝试使用一些布尔值在有人回答之前,或者在你想出一个解决方案之前,你必须先研究一下什么是按下的,什么不是。使用布尔值,例如:
moveUp=false;
。如果用户按W,将其设置为true,然后在其他地方检查
If(moveUp)applyForce to player
,如果玩家释放密钥,则将设置为false。这比始终在数组中搜索现在释放的密钥更容易处理和更快。
<code>

    public class MainInputProcessor implements InputProcessor {


    // REFERENCE:
    // <Listener, <ACTION, KEYCODE>>
    private Array<ObjectMap<RacketMovementListener, ObjectMap<Racket.ACTIONS, Integer>>> racketMovementListeners;

    // Stores the keys that are held down
    private IntArray heldKeys;


    // Initialisation
    public MainInputProcessor() {
        heldKeys = new IntArray();
        racketMovementListeners = new Array<ObjectMap<RacketMovementListener, ObjectMap<Racket.ACTIONS, Integer>>>();

    }

    // Adds a RacketMovementListener to the respective subscriber list
    public void subscribeToRacketMovement(RacketMovementListener newSubscriber, ObjectMap<Racket.ACTIONS, Integer> movementKeys) {
        ObjectMap<RacketMovementListener, ObjectMap<Racket.ACTIONS, Integer>> map = new ObjectMap<RacketMovementListener, ObjectMap<Racket.ACTIONS, Integer>>();

        map.put(newSubscriber, movementKeys);

        racketMovementListeners.add(map);
    }

    // Update and execute event action
    public void updateEvents() {

        // Fire events for racket movement subscribers if the keys match
        if (!heldKeys.isEmpty()) {
            for (ObjectMap<RacketMovementListener, ObjectMap<Racket.ACTIONS, Integer>> map : racketMovementListeners) {
                for (RacketMovementListener listener : map.keys()) {
                    for (Integer keycode : heldKeys.items) {

                        if (map.get(listener).get(Racket.ACTIONS.MOVE_DOWN).equals(keycode)) {
                            listener.moveDownPressed(listener);
                        } if (map.get(listener).get(Racket.ACTIONS.MOVE_UP).equals(keycode)) {
                            listener.moveUpPressed(listener);
                        }
                    }
                }
            }

        }
    }

    @Override
    public boolean keyDown(int keycode) {

        // Add keycode to heldKeys if it's not already there
        if (!heldKeys.contains(keycode)) {
            heldKeys.add(keycode);
            return true;
        }

        return false;

    }

    @Override
    public boolean keyUp(int keycode) {
        // Remove keycode from heldKeys since the key is no longer held down
        for (Integer code : heldKeys.items) {
            if (code == keycode) {
                heldKeys.removeValue(code);
            }
        }
        return true;
    }
</code>