- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 Java FX“游戏”中执行一个简单的操作,每次按下空格键时, pig 的图像都会向上“跳跃”。这是关键事件处理程序的代码和我用来实际执行操作的动画计时器。
关键处理程序:
ArrayList<String> in = new ArrayList<String>();
s.setOnKeyPressed(
new EventHandler<KeyEvent>()
{
public void handle(KeyEvent e)
{
String code = e.getCode().toString();
if ( !in.contains(code) ){
in.add( code );
}
}
});
s.setOnKeyReleased(
new EventHandler<KeyEvent>()
{
public void handle(KeyEvent e)
{
String code = e.getCode().toString();
in.remove( code );
}
});
动画定时器:
new AnimationTimer()
{
double q = 200;
public void handle(long currentNanoTime)
{
double t = (currentNanoTime - startNanoTime) / 4000000.0;
if(in.contains("SPACE")){
q -= 20;
}
double y = q + t;
if(y >= 520){
gc.drawImage(background1, 0, 0, 1160, 740);
gc.drawImage(pig, 90, 520, 125, 100);
}else{
gc.drawImage(background1, 0, 0, 1160, 740);
gc.drawImage(pig, 90, y, 125, 100);
}
}
}.start();
如您所见,我让动画计时器简单地使“ pig ”沿 y 轴逐渐下降,当按下空格键时,它会稍微向上插入。
问题是,如果按住空格键, pig 只会不停地向上飞。我希望防止这种情况发生,以便必须反复敲击空格键,而不仅仅是按住它。所以我只想按空格键一次“跳跃”。我尝试解决的任何方法都没有奏效。我该怎么做?
最佳答案
编辑: 我修改了答案。最初的解决方案使用了一个计数器,它可以防止按下的键在一段时间内产生任何影响。不幸的是,这不是这个问题的目的。 :) 当前的解决方案更直接,仅使用简单的 boolean 锁。
在回答这个问题之前,这里有一些烦人的提示:我建议使用 Map<KeyCode, Boolean>
而不是 List<String>
存储有关当前按下的键的信息。它将在可读性方面简化您的代码,同时提升其性能。接下来,创建一个专用对象来存储有关 pig 的信息(哈哈!)可能是个好主意。最后,使用常量而不是硬编码文字值是一种很好的做法。
另外请注意,您实际上不需要存储有关是否按下空格键的信息,然后从计时器线程中引用它。仅当您希望通过按住空格键来控制 pig 时才需要这样做。但是由于您希望它只在按下空格键时跳转,您可以告诉 pig 直接从处理程序切换到“跳转”状态。当然,这不会解决您的问题,因为 onKeyPressed
长时间按住某个键时,会重复调用处理程序。但我认为值得一提。 :)
现在,回答这个问题。如果您想快速修复当前的解决方案并忽略所有“良好实践”废话,请只关注 jumpLock
Pig
的领域类(class)。诀窍是不断告诉 pig 像你现在做的那样反复跳跃,但要确保 pig 只有在 jumpLock
时才会服从。允许它这样做。
注意:以下解决方案假设您将使用固定间隔(例如每 30 毫秒)更新游戏状态。但正如最后指出的那样,可以轻松修改此解决方案以使用基于 FPS 的计时器。
以下类包含您在将来调整游戏时可能希望更改的常量:
public final class Settings {
private Settings() {
}
public static final double BOOST_VELOCITY = 10.0;
public static final double GRAVITY = 0.3;
}
这个类代表 pig 。 x
和 y
字段存储有关 pig 当前位置的信息。 velocityX
和 velocityY
是分别包含有关 pig 在 X 轴和 Y 轴上的方向和“速度”信息的 vector 。 jumpLock
是一个简单的 boolean 标志,实际上是您问题的解决方案。每当用户进行跳跃时,此锁将设置为 true
.它将一直保持这种状态,直到它被告知释放锁,这将在用户释放空格键时发生。
public final class Pig {
private double x;
private double y;
private double velocityX;
private double velocityY;
private boolean jumpLock;
public Pig() {
// ...
}
public void timeChanged() {
x += velocityX;
y += velocityY;
velocityY -= Settings.GRAVITY;
}
public void jumpBoost() {
if (!jumpLock) {
velocityY = Settings.BOOST_VELOCITY;
jumpLock = true;
}
}
public void releaseLock() {
jumpLock = false;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
您的处理程序可能看起来像这样。注意 Map<KeyCode, Boolean>
用于存储有关当前按下的键的信息。它的性能优于 List<String>
在这个情况下。同时添加 @Override
即使在覆盖抽象方法时,注释也是一种很好的做法:
final Map<KeyCode, Boolean> keyboard = new HashMap<>();
keyboard.put(KeyCode.SPACE, false);
scene.setOnKeyPressed(
new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent e) {
if (e.getCode() == KeyCode.SPACE) {
keyboard.put(e.getCode(), true);
// You could alternately call pig.jumpBoost()
// directly from this handler and not having to
// deal with the 'keyboard' map at all
// as illustrated with by pig.releaseLock()
// in the next handler
}
}
});
scene.setOnKeyReleased(
new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent e) {
if (e.getCode() == KeyCode.SPACE) {
keyboard.put(e.getCode(), false);
pig.releaseLock(); // IMPORTANT!!!
}
}
});
最后,必须重复执行以下代码片段。此解决方案假定此代码将以固定间隔执行,例如每 30 毫秒一次。如果您使用基于 FPS 的计时器(意味着执行之间会有不规则的间隔),您应该将自上次更新以来耗时作为参数传递给 timeChanged()
。方法,并在该方法中与它相乘。
pig.timeChanged();
if (keyboard.get(KeyCode.SPACE)) {
pig.jumpBoost();
}
// Note that pig.releaseLock() could be called in else
// branch here and not in the onKeyReleased handler.
// Choose whatever solution suits you best.
// + draw image of the pig on pig.getX() and pig.getY() coordinates
希望我做对了。写这篇文章时我几乎睡着了,一开始误解了这个问题。但我真的需要赢得一些声誉点数才能被允许对目前对我来说很重要的问题发表评论。哈哈! :D:D
关于java - 如何防止按住某个键重复操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48120739/
我正在尝试为 Adobe After Effects 脚本编写 UI。我想添加一个功能,用户可以按住 CTRL 键单击按钮,而不是直接单击按钮而不按任何按键,以获得稍微不同的行为。 但是,问题是,
这个问题已经有答案了: Using Java's Robot to hold a key down (2 个回答) 已关闭 7 年前。 我想知道是否有什么方法可以在Java中按住一个键一段时间。问题是
案例展示: 如果点击按钮,然后按住'enter'键,按钮的点击事件会不断触发。 document.querySelector('button').addEventListener('click', f
在尝试获取时间时,我没有得到预期的值。 当我运行这个时,时间是 19:59。而在 timeDifferenceString 中,Value 为 71976.894206。我认为这是当前时间。 我计算
我想实现一个按住按钮。因此,当您按下按钮时,功能 A 将执行,而当您松开按钮时,功能 B 将执行。我找到了这个,但这不是我想要的。 UIButton Touch and Hold 我不想要任何重复的
html a visit reigel-codes.co.cc 问题 如何通过按住左键单击在 之后添加复选框?..然后在释放左键时停止添加... 到目前为止我已经尝试过 $(
有点像编程新手,制作了一个测试演示来弄清楚按键输入是如何工作的。在我开始注意到某些 key 未被注册之前,该演示看起来不错。我只是按住 q -> w -> e -> r -> t 并且 t 没有出现在
所以在模拟器上,这个菜单图标看起来像(未按下时): 当我按住它时,它周围会出现一些笔触/轮廓,如下所示: 然而,当我将应用程序放在我的 (kitkat api) 手机上时,圆形图标周围的整个正方形都会
我制作了两个片段,相同的代码,一个在 JSFiddle 中一个作为 Stack Snippet(见下文)。出于某种原因,Ctrl 键 + 拖动会产生不同的结果。 如果我按住 Ctrl 键,JSFidd
我正在做一个项目,我需要检测音量降低按钮的按下以及该键的长按。我尝试使用 onKeyDown 和 onKeyLongPress 方法。但它不起作用。我该如何解决这个问题? 最佳答案 这可以使用标志来完
我有一个Sudoku我想制作它,以便用户可以按下 Shift 键并按住它,同时使用箭头键在单元格之间上下移动。已设置的单元格为 标签与其他标签类似,但它们具有 readonly属性。每个单元格都有一个
正如问题的标题所述,当我在 iOS 中按住一个按钮时,我希望显示该按钮的标题。我该怎么做?需要一些建议.. 最佳答案 试试这个,也许它会对你有帮助... [btnName setTitle:@"You
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and t
我已经在 Red5 服务器上配置了 Red5Phone。我能够连接到 Asterisk 服务器,它工作正常。我使用 Flex 作为客户端。 Red5 和 Asterisk 在同一台服务器上。 现在我想
我想让某个方法运行并在某人的手指按下按钮时重复运行。我希望该方法在手指不再位于按钮上时停止自身重复 有没有办法检查在方法实现过程中是否仍然发生触碰?帮助! 最佳答案 您可以使用 UIControlEv
我正在开发在 Windows XP Standard 上运行的触摸屏应用程序。使用当前的硬件来调用右键单击用户必须单击并按住几秒钟,但这可能会干扰其他操作,例如在滚动查看器中按住重复按钮,因此我决定禁
当用户输入 html 输入文本时,当用户故意或错误地按下 Alt 键时,是否可以阻止浏览器显示其菜单 最佳答案 这应该适合你。 fiddle : http://jsfiddle.net/2dqCD/
在我的控制台中,我的以下脚本不仅在单击鼠标滚轮时开始记录,还在您停止按住鼠标滚轮按钮后继续记录。 var mPosX, mPosY; $(document).on('mousedown', f
按住 Shift 键时,我无法获得某些数字键盘键的正确代码。仅当数字锁定键打开时,数字键盘上的数字键和 point/del 键才会发生这种情况。 $('body').keyup(function (e
我有 10 个 div ... 我想使用 jQuery 使用点击处理程序选择其中的 5 个。 $(".myDivs").on("click", function() { console.
我是一名优秀的程序员,十分优秀!