Java 如何暂停键盘管理器进行跳跃?
我想让我的玩家跳跃,但目前当按下空格键时,玩家会无休止地跳跃。我只希望能够使用空格键一次。我认为这与我的getInput()方法经常被勾选有关,我曾尝试暂停线程,但这对我来说并不奏效 下面是KeyManager:Java 如何暂停键盘管理器进行跳跃?,java,2d,Java,2d,我想让我的玩家跳跃,但目前当按下空格键时,玩家会无休止地跳跃。我只希望能够使用空格键一次。我认为这与我的getInput()方法经常被勾选有关,我曾尝试暂停线程,但这对我来说并不奏效 下面是KeyManager: package com.zetcode; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class KeyManager implements KeyListener{ pri
package com.zetcode;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class KeyManager implements KeyListener{
private boolean[] keys;
public boolean up, down, left, right;
public boolean jump;
public float jumpingTime = 200;
public KeyManager(){
keys = new boolean[256];
}
public void tick(){
down = keys[KeyEvent.VK_S] ;
left = keys[KeyEvent.VK_A];
right = keys[KeyEvent.VK_D];
jump = keys[KeyEvent.VK_SPACE];
}
@Override
public void keyPressed(KeyEvent e) {
keys[e.getKeyCode()] = true;
System.out.println("A Key was pressed");
if(e.getKeyCode() == KeyEvent.VK_SPACE){
}
}
@Override
public void keyReleased(KeyEvent e) {
keys[e.getKeyCode()] = false;
}
@Override
public void keyTyped(KeyEvent e) {
}
}
这是我的玩家课程:
package com.zetcode;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
public class Player extends Creature {
private Creature creature;
public Player(Handler handler, float x, float y) {
super(handler, x, y, Creature.PLAYER_WIDTH, Creature.PLAYER_HEIGHT);
bounds.x = 16;
bounds.y = 31;
bounds.width = 40;
bounds.height = 58;
}
@Override
public void tick() {
getInput();
move();
handler.getGameCamera().centerOnEntity(this);
}
private void getInput(){
xMove = 0;
yMove = 3;
gravity = 2;
if(handler.getKeyManager().jump)
yMove = -speed + -5;
if(handler.getKeyManager().down)
yMove = speed;
if(handler.getKeyManager().left)
xMove = -speed;
if(handler.getKeyManager().right)
xMove = speed;
}
@Override
public void render(Graphics g) {
g.drawImage(Assets.player, (int) (x - handler.getGameCamera().getxOffset()), (int) (y - handler.getGameCamera().getyOffset()), width, height, null);
//g.setColor(Color.RED);
//g.fillRect((int) (x + bounds.x - handler.getGameCamera().getxOffset()),
// (int) (y + bounds.y - handler.getGameCamera().getyOffset()),
// bounds.width, bounds.height);
}
}
在你的生物类中添加一个布尔标志“跳跃”。然后将其添加到getInput方法:
if (!isJumping && handler.getKeyManager().jump)
{
//...apply your transformations for jumping
isJumping = true;
}
这样可以防止每次按键时都跳转。但现在更棘手的部分来了:这将(在您当前的代码中)只触发一次跳跃,因为游戏不知道您的角色何时落地。所以你需要在你的生物和地面之间进行碰撞检测
在web上有一些关于碰撞检测的好文章,如果您使用的是物理引擎,碰撞通常已经包括在内
假设你实现了一个方法,该方法被称为,一旦你的生物落地,你可以添加以下内容:
public void creatureHitGround()
{
//...other stuff on hit ground
isJumping=false;
}
在这里,您可以重置isJumping标志,该标志允许您触发新的跳转
结果:你按了很多次键,但只有当你回到地面时才跳