Java 如何暂停键盘管理器进行跳跃?

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

我想让我的玩家跳跃,但目前当按下空格键时,玩家会无休止地跳跃。我只希望能够使用空格键一次。我认为这与我的getInput()方法经常被勾选有关,我曾尝试暂停线程,但这对我来说并不奏效

下面是KeyManager:

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标志,该标志允许您触发新的跳转

结果:你按了很多次键,但只有当你回到地面时才跳