当前位置: 首页 > 知识库问答 >
问题:

如何在按键仍处于按下状态时阻止对象移动

沈皓君
2023-03-14

我是Java编程的初学者

物体一次只能移动一个正方形,如果用户想移动到另一个正方形,他们必须再次按键。我的移动方法如下:

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

我正在使用KeyListener接口来实现keyPressed、keyTyped和KeyRelease方法,我有下面的片段中的条件,在keyPressed内部

//KeyPressed
int c = e.getKeyCode();

if (c == KeyEvent.VK_UP) {
    player.setDy(-5);
}

这允许对象自由移动。但是,只要按下向上箭头,它显然会继续移动。

有没有办法让物体向上移动一次,比如说-5,然后即使按键仍然按下,也要停止?

我不确定是否需要更改我的移动方法或KeyListener方法来执行此操作。

我希望我已经足够清楚我在问什么,我非常感谢任何建议。

共有2个答案

苏培
2023-03-14

最简单的方法是添加一个布尔值来指示按下了移动键

类成员:boolean movingKeyPressed=false

按下in键:

if (movingKeyPressed) {
   return;
} else {
   // do stuff
   movingKeyPressed = true;
}

在关键发布方法中:

movingKeyPressed = false;

黄英韶
2023-03-14

首先:你应该使用同步如果你调用类的方法从监听器像keyPresskeyReleated-这是因为你的监听器方法可以从多个线程调用,所以你的类方法(player.setDy())可以(并将)并行调用-你需要确保每次调用setDy发生在下一个之前。

此外:keyTyped在许多情况下都要好得多:https://stackoverflow.com/a/7071810/351861

例如:

public void keyTyped(KeyEvent arg0) {
   if(arg0.getKeyCode() == KeyEvent.VK_UP)
   {
       synchronized(player)
       {
          player.setDy(-5);
       }
   }
}

这将按顺序可靠地调用setDy。现在,您需要做的就是确保setDy按预期工作,因此只需设置一次位置

 类似资料:
  • 我整天都在用这些按钮。首先,这两个按钮都在对方的上面,看起来像这样,http://I.imgur.com/wvmntpq.jpg,现在在这里发布了一个问题之后,它看起来像这样,http://imgur.com/omxdqct我被告知在我的css中改变如下: css:button{ float:left;margin-top:250px;color:white;display:block;margi

  • 我以编程方式生成了许多按钮(一些按钮用于增加值,而另一些按钮用于减少值),当它们调整的值达到最大值或最小值时,我会禁用这些按钮。(即,当达到最大值时,“增加”按钮被禁用,而当达到最小值时,“减少”按钮被禁用。)除了禁用,我还将按钮状态设置为“按下”,以直观地指示已达到极限值,并且按钮不再工作。 我的按钮onClickListener的'增加'按钮看起来像这样: ClickListeners上相应的

  • 我用tkinter创建了一个文本框。当按下Ctrl返回时,以下代码将停止创建换行符。 但是,我还想在用户键入Ctrl-Return时调用一个函数。下面调用该函数,但随后创建一个换行: 如果交换第三行和第四行,则没有换行符,但也不会调用该函数。 有没有一种既防止换行符又调用函数的方法?

  • 问题内容: 从MDN for NodeList: 在某些情况下,NodeList是一个实时集合,这意味着DOM中的更改会反映在集合中。例如,Node.childNodes处于活动状态: 在其他情况下,NodeList是静态集合,这意味着DOM中的任何后续更改都不会影响集合的内容。document.querySelectorAll返回一个静态NodeList。 所以....有点烦!是否有任何关于哪些

  • 我正在尝试制作一个计算贷款利息的简单程序。我这里的代码可以工作,但只会在按下'c'键时显示结果。我如何改变逻辑,以便一旦'c'被按下,结果就会出现在屏幕上。任何的帮助都是非常感谢的。

  • 我有一个组件,它作为一个道具发送一个方法来改变表单的输入值(像任何基本表单一样)。在onChange开始工作后,我决定添加一个clear按钮来一次清除所有输入值,因此我创建了一个方法来清除所有输入。 示例: 像上面的方法那样清除会产生一个错误,因为我要移除state中的键,而表单输入的值是针对state的。没问题,所以我想,我只需要将setState中的所有输入添加到一个空字符串,如:which