Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何同时响应两个不同的按键事件?_Java_Game Physics_Keylistener_Keyevent_Game Development - Fatal编程技术网

Java 如何同时响应两个不同的按键事件?

Java 如何同时响应两个不同的按键事件?,java,game-physics,keylistener,keyevent,game-development,Java,Game Physics,Keylistener,Keyevent,Game Development,所以我基本上是用java创建一个platformer游戏。这里有一个简单的问题。我可以同时响应两个不同的按键事件吗?例如,我按下向右箭头键,我的播放器向右移动。现在,我想让我的球员跳起来,但继续向右移动。为此,我需要同时响应两个不同的KeyEvent。我如何做到这一点?我还没有尝试过任何代码,因为我不知道从哪里开始。提前感谢您的回答。您可以使用单独的“KeyDown”和“keydup”事件,为您的播放器设置状态值 public class KeyboardListener extends JFr

所以我基本上是用java创建一个platformer游戏。这里有一个简单的问题。我可以同时响应两个不同的按键事件吗?例如,我按下向右箭头键,我的播放器向右移动。现在,我想让我的球员跳起来,但继续向右移动。为此,我需要同时响应两个不同的KeyEvent。我如何做到这一点?我还没有尝试过任何代码,因为我不知道从哪里开始。提前感谢您的回答。

您可以使用单独的“KeyDown”和“keydup”事件,为您的播放器设置状态值

public class KeyboardListener extends JFrame implements KeyListener {

public KeyboardListener() {
    addKeyListener(this);
}

@Override
public void keyPressed(KeyEvent e) {

    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
        System.out.println("Right key pressed");
    }
    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
        System.out.println("Left key pressed");
    }

}

@Override
public void keyReleased(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
        System.out.println("Right key Released");
    }
    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
        System.out.println("Left key Released");
    }
}

public static void main(String[] args) {
    new KeyboardListener();
}
}
你的玩家需要一个状态机

public class KeyboardListener extends JFrame implements KeyListener {

public KeyboardListener() {
    addKeyListener(this);
}

@Override
public void keyPressed(KeyEvent e) {

    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
        System.out.println("Right key pressed");
    }
    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
        System.out.println("Left key pressed");
    }

}

@Override
public void keyReleased(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
        System.out.println("Right key Released");
    }
    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
        System.out.println("Left key Released");
    }
}

public static void main(String[] args) {
    new KeyboardListener();
}
}
使用KeyListener界面中的keyPressed和keyReleased事件处理程序,并将当前播放器状态(如行走、跳跃、向左行走、向右行走等)保存为布尔值

在主循环中,您可以检查玩家处于何种状态,并更改其坐标。比如:

if(player.left) { player.x += speed } //etc.
您可以使用单独的“按键向下”和“按键向上”事件,并为您的播放器设置状态值

public class KeyboardListener extends JFrame implements KeyListener {

public KeyboardListener() {
    addKeyListener(this);
}

@Override
public void keyPressed(KeyEvent e) {

    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
        System.out.println("Right key pressed");
    }
    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
        System.out.println("Left key pressed");
    }

}

@Override
public void keyReleased(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
        System.out.println("Right key Released");
    }
    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
        System.out.println("Left key Released");
    }
}

public static void main(String[] args) {
    new KeyboardListener();
}
}
你的玩家需要一个状态机

public class KeyboardListener extends JFrame implements KeyListener {

public KeyboardListener() {
    addKeyListener(this);
}

@Override
public void keyPressed(KeyEvent e) {

    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
        System.out.println("Right key pressed");
    }
    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
        System.out.println("Left key pressed");
    }

}

@Override
public void keyReleased(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
        System.out.println("Right key Released");
    }
    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
        System.out.println("Left key Released");
    }
}

public static void main(String[] args) {
    new KeyboardListener();
}
}
使用KeyListener界面中的keyPressed和keyReleased事件处理程序,并将当前播放器状态(如行走、跳跃、向左行走、向右行走等)保存为布尔值

在主循环中,您可以检查玩家处于何种状态,并更改其坐标。比如:

if(player.left) { player.x += speed } //etc.

您可能希望使用线程,然后将按键添加到播放器物理类的列表中

public class KeysListener implements KeyListener
    ...
    //FIRST THREAD
    new Thread(new Runnable() {
        @Override
        public void run() {
            public void keyEvent(KeyEvent e) {
                 int key = e.getKeyCode();
                 //TODO ADD KEY TO A LIST IN THE CLASS THAT HANDLES YOUR PHYSYICS
            }
        }
    }).start();
    //SECOND THREAD
    new Thread(new Runnable() {
        @Override
        public void run() {
            public void keyEvent(KeyEvent e) {
                 int key = e.getKeyCode();
                 //TODO ADD KEY TO A LIST IN THE CLASS THAT HANDLES YOUR PHYSICS
            }
        }
    }).start();
...
}

根据需要添加任意数量的线程。

您可能希望使用线程,然后将按键添加到播放器物理类的列表中

public class KeysListener implements KeyListener
    ...
    //FIRST THREAD
    new Thread(new Runnable() {
        @Override
        public void run() {
            public void keyEvent(KeyEvent e) {
                 int key = e.getKeyCode();
                 //TODO ADD KEY TO A LIST IN THE CLASS THAT HANDLES YOUR PHYSYICS
            }
        }
    }).start();
    //SECOND THREAD
    new Thread(new Runnable() {
        @Override
        public void run() {
            public void keyEvent(KeyEvent e) {
                 int key = e.getKeyCode();
                 //TODO ADD KEY TO A LIST IN THE CLASS THAT HANDLES YOUR PHYSICS
            }
        }
    }).start();
...
}

根据需要添加尽可能多的线程。

取决于您使用的框架,例如AWT、Swing或JavaFX。很抱歉,我告诉您,“我还没有尝试过任何代码”是这个网站上的预告句。。。另外,你应该在这里发布这样的问题:取决于你正在使用的框架,例如AWT、Swing或JavaFX。我很抱歉地告诉你,“我还没有尝试过任何代码”是这个网站上被禁止的句子。。。此外,您应该在此处发布类似的问题: