使用 KeyListener 一次接受 2 个键盘输入
Posted
技术标签:
【中文标题】使用 KeyListener 一次接受 2 个键盘输入【英文标题】:Accepting 2 keyboard inputs at once using KeyListener 【发布时间】:2019-08-07 17:10:00 【问题描述】:public void keyPressed(KeyEvent e)
if (e.getKeyCode() == 32) //spacekey
if (menu.isRun == true) //Checks if menu is active or not
if (framecount > 10) //Prevents too many missiles
instance.player.spaceKeyPressed();
framecount = 0;
menu.isRun = true; //sets menu to inactive
if (toggle != true)//prevents reopening game after a game over
if (menu.spaceKeyPressed())
instance.CanRun = true; //loads game
toggle = true;
menu.update();//updates menu
if (e.getKeyCode() == 39) instance.player.rightKeyPressed();//right key moves player right
if (e.getKeyCode() == 37) instance.player.leftKeyPressed(); //left key moves player left
有了这个,用户只能移动或射击,不能同时进行。例如,如果用户按住右箭头向右移动并按空格,用户将停止。
【问题讨论】:
写if (e.getKeyCode() == KeyEvent.VK_RIGHT)
,而不是测试39。你的代码会更容易理解。
@VGR “您的代码将更容易理解。” 我还使用常量进行编译时完整性检查。编译器不会选择93
而不是39
,但它会检测到KeyEvent.VK_RIHGT
有问题。
【参考方案1】:
使用类级别的属性集合来确定按下了哪些其他键。您必须为在迭代列表的keyPressed
函数中按下多个键实现逻辑。同时从 keyReleased
函数的列表中删除密钥。
【讨论】:
【参考方案2】:boolean keyA=false;
boolean keyD=false;
// keys
@Override
public void keyPressed(KeyEvent e)
int key= e.getKeyCode();
if(key==KeyEvent.VK_A)
keyA=true;
if(key==KeyEvent.VK_D)
keyD=true;
@Override
public void keyReleased(KeyEvent e)
int key= e.getKeyCode();
if(key==KeyEvent.VK_A)
keyA=false;
if(key==KeyEvent.VK_D)
keyD=false;
//In constructor
new Thread(()->
while(true)
tryThread.sleep(10);
catch (InterruptedException e)
if(keyA)
player.moveLeft();
if(keyD)
player.moveRight();
).start();
注意KeyEvent.VK_A
的用法,让生活变得更简单。
另外,请确保您的线程中有 sleep(),因为如果它只是 while(true),则循环中的任何内容都不会执行。
【讨论】:
以上是关于使用 KeyListener 一次接受 2 个键盘输入的主要内容,如果未能解决你的问题,请参考以下文章