有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Libgdx触地/触地与Gdx。输入isKeyPressed/Gdx。输入按键刚按下吗

这是我的困境。我在使用GamePad类制作闪电攻击动画时遇到问题(我为安卓设备的游戏控制器制作了这个类)

我发现如果使用Gdx。输入isKeyPressed(keyname),该代码每帧产生一次闪电攻击,这些攻击堆叠在彼此的顶部。于是,我使用了Gdx。输入isKeyJustPressed(),它只创建一个攻击,即动画,这是完美的

因此,在制作GamePad类时,我使用侦听器制作图像来处理触摸事件。对于每个按钮,我都有一个触地和触地方法。从左到右运行我的角色时,这些触摸事件工作正常。但是,与Gdx类似。输入isKeyPressed(),闪电攻击会在每一帧中创建,并且攻击会层叠在一起。我尝试了一种解决方法来修复每帧攻击的创建,现在图像只是静态的,没有动画。这比每秒60帧要好,但不能解决我的问题

是否有类似Gdx的着陆事件。输入isKeyJustPressed()?如何修复GamePad类,使其与Config类类似

游戏板。爪哇

public class GamePad implements Disposable{

private Viewport viewport;
public Stage stage;
boolean leftPressed, rightPressed, pausePressed, aPressed, bReleased, bPressed, bPreviouslyPressed;
private Config config = Config.getInstance();
private Table table;

public GamePad(){
    viewport = new FitViewport(EIUGame.V_WIDTH, EIUGame.V_HEIGHT, new OrthographicCamera());
    stage = new Stage(viewport);

    table = new Table();
    table.setFillParent(true);
    table.bottom();

    bPreviouslyPressed = false;

    // "Left" Button
    Image leftImg = new Image(new Texture("controller/leftButton.png"));
    leftImg.setSize(35, 35);
    leftImg.addListener(new InputListener(){

        @Override
        public boolean touchDown(InputEvent event, float x, float y, int pointer, int button){
            leftPressed = true;
            return true;
        }


        @Override
        public void touchUp(InputEvent event, float x, float y, int pointer, int button){
            leftPressed = false;
        }
    });

    // "Right" Button
    Image rightImg = new Image(new Texture("controller/rightButton.png"));
    rightImg.setSize(35, 35);
    rightImg.addListener(new InputListener(){

        @Override
        public boolean touchDown(InputEvent event, float x, float y, int pointer, int button){
            rightPressed = true;
            return true;
        }

        @Override
        public void touchUp(InputEvent event, float x, float y, int pointer, int button){
            rightPressed = false;
        }
    });

    // "Pause" Button
    Image pauseImg = new Image(new Texture("controller/pauseButton.png"));
    pauseImg.setSize(15, 15);
    pauseImg.addListener(new InputListener(){

        @Override
        public boolean touchDown(InputEvent event, float x, float y, int pointer, int button){
            pausePressed = true;
            return true;
        }

        @Override
        public void touchUp(InputEvent event, float x, float y, int pointer, int button){
            pausePressed = false;
        }
    });

    // "A" Button
    Image aImg = new Image(new Texture("controller/aButton.png"));
    aImg.setSize(35, 35);
    aImg.addListener(new InputListener(){

        @Override
        public boolean touchDown(InputEvent event, float x, float y, int pointer, int button){
            aPressed = true;
            return true;
        }

        @Override
        public void touchUp(InputEvent event, float x, float y, int pointer, int button){
            aPressed = false;
        }
    });

    // "B" Button
    Image bImg = new Image(new Texture("controller/bButton.png"));
    bImg.setSize(35, 35);
    bImg.addListener(new InputListener(){

        @Override
        public boolean touchDown(InputEvent event, float x, float y, int pointer, int button){
            bPressed = true;
            setBReleased(false);
            return true;
        }

        @Override
        public void touchUp(InputEvent event, float x, float y, int pointer, int button){
            setBReleased(true);
            bPreviouslyPressed = false;
            bPressed = false;
        }
    });

    table.add(leftImg).size(leftImg.getWidth(), leftImg.getHeight());
    table.add().size(5,35);
    table.add(rightImg).size(rightImg.getWidth(), rightImg.getHeight());
    table.add().size(100, 35);
    table.add(pauseImg).size(pauseImg.getWidth(), pauseImg.getHeight()).bottom();
    table.add().size(100, 35);
    table.add(bImg).size(bImg.getWidth(), bImg.getHeight());
    table.add().size(5,35);
    table.add(aImg).size(aImg.getWidth(), aImg.getHeight());

    stage.addActor(table);
}

// Returns the stage object so that it can be added to a multiplexer
public Stage getStage() {
    return stage;
}

public void draw(){
    stage.draw();
}

public boolean isLeftPressed(){
    return leftPressed;
}

public boolean isRightPressed(){
    return rightPressed;
}

public boolean isPausePressed(){
    return pausePressed;
}

public boolean isAPressed(){
    return aPressed;
}

public boolean isBPressed(){
    return bPressed;
}

public boolean isBPreviouslyPressed(){
    return bPreviouslyPressed;
}

public boolean isBReleased(){
    return bReleased;
}

public void setBReleased(boolean released){
    bReleased = released;
}

public void resize(int width, int height){
    viewport.update(width, height);
}

public void animateChamp(Champion champ, PauseState pause){
    // Move Champion Right
    if (isRightPressed() && champ.b2body.getLinearVelocity().x <= 2)
        config.runRight(champ);
    // Move Champion left
    if (isLeftPressed() && champ.b2body.getLinearVelocity().x >= -2)
        config.runLeft(champ);
    // If A button is pressed and we are not jumping or falling, then Jump.
    if (isAPressed() && (champ.getState() != champState.JUMPING && champ.getState() != champState.FALLING)){
        config.jump(champ);
        aPressed = false;
    }
    // Toggle Pause Menu
    if (isPausePressed())
        pause.togglePause();

    // Precondition for next else-if statement
    if (isBPressed() && champ.b2body.getLinearVelocity().x == 0 && champ.b2body.getLinearVelocity().y == 0){
        bPressed = false;
        bPreviouslyPressed = true;
    }
    // If b was pressed down but not released, and champion is not moving, use lightning attack
    else if (bPreviouslyPressed && !isBReleased() && champ.b2body.getLinearVelocity().x == 0 && champ.b2body.getLinearVelocity().y == 0){
        champ.setMobileTrigger(true);        // Sets champion state to attacking region
        config.setMLightningActive(true);
        config.lightningAttack(champ);
    }
    // Exit lightning attack if moved
    else if (!isBReleased() && (champ.b2body.getLinearVelocity().x != 0 || champ.b2body.getLinearVelocity().y != 0)){
        champ.setMobileTrigger(false);
        config.setMLightningActive(false);
        bReleased = true;
    }
    // Exit lightning attack if button released
    else if (isBReleased() && config.getMLightningActive()){
        champ.setMobileTrigger(false);         // Does not alter champion state
        config.setMLightningActive(false);
        bReleased = true;
    }
    // Attack when moving
    else if (isBPressed()){
        config.attack(champ);
        bPressed = false;
    }

}

@Override
public void dispose(){
    stage.dispose();
}
}

配置。爪哇

public final class Config {
private static final Config instance = new Config();

private int moveLeft;   
private int moveRight;      
private int jump;
private int attack;
private String lStr;
private String rStr;
private String jStr;
private String aStr;
private boolean lightningActive = false;
private boolean MlightningActive = false;   // Mobile Game

// Default constructor sets the keys to a default schema
private Config() {
    moveLeft = Input.Keys.A;    
    moveRight = Input.Keys.D;       
    jump = Input.Keys.L;
    attack = Input.Keys.J;
    lStr = "A";
    rStr = "D";
    jStr = "L";
    aStr = "J";
}

// Return the instance of the class
public static Config getInstance() {
    return instance;
}

public void animateChamp(Champion champ){

    // Jump!
    if(Gdx.input.isKeyJustPressed(jump) && (champ.getState() != champState.JUMPING && champ.getState() != champState.FALLING))
        jump(champ);

    // Run Right (and make sure character is not moving faster than 2)
    if(Gdx.input.isKeyPressed(moveRight) && champ.b2body.getLinearVelocity().x <= 2)
        runRight(champ);

    // Run Left (and make sure character is not moving faster than 2)
    if(Gdx.input.isKeyPressed(moveLeft) && champ.b2body.getLinearVelocity().x >= -2)
        runLeft(champ);     

    // Lightning Attack
    if(Gdx.input.isKeyJustPressed(attack) && champ.b2body.getLinearVelocity().x == 0 && champ.b2body.getLinearVelocity().y == 0){
        setLightningActive(true);
        lightningAttack(champ);         
    }
    else if (getlightningActive() && (champ.b2body.getLinearVelocity().x != 0 || champ.b2body.getLinearVelocity().y != 0 || !Gdx.input.isKeyPressed(attack)))
        setLightningActive(false);

    else if (Gdx.input.isKeyJustPressed(attack))
        attack(champ);
}

public void runRight(Champion champ){
    champ.b2body.applyLinearImpulse(new Vector2(0.1f,0), champ.b2body.getWorldCenter(), true);
}

public void runLeft(Champion champ){
    champ.b2body.applyLinearImpulse(new Vector2(-0.1f,0), champ.b2body.getWorldCenter(), true);
}

public void jump(Champion champ){
    champ.b2body.applyLinearImpulse(new Vector2(0, 4.5f), champ.b2body.getWorldCenter(), true);
}

public void attack(Champion champ){
    champ.attack();
}

public void lightningAttack(Champion champ){
    champ.lightningAttack();
}

public boolean getlightningActive(){
    return lightningActive;
}

public void setLightningActive(boolean value){
    lightningActive = value;
}

// For Mobile Version
public boolean getMLightningActive(){
    return MlightningActive;
}

// For Mobile Version
public void setMLightningActive(boolean value){
    MlightningActive = value;
}

// sets the key to move left
public void setMoveLeft(String n){
    moveLeft = Input.Keys.valueOf(n.toUpperCase());
    lStr = n;
}

// sets the key to move right
public void setMoveRight(String n) {
    moveRight = Input.Keys.valueOf(n.toUpperCase());
    rStr = n;
}

// sets the key to jump
public void setJump(String n) {
    jump = Input.Keys.valueOf(n.toUpperCase());
    jStr = n;
}

// sets the key to attack
public void setAttack(String n) {
    attack = Input.Keys.valueOf(n.toUpperCase());
    aStr = n;
}

// Returns the string representation of the move left key
public String getMoveLeft(){
    return lStr;
}

// Returns the string representation of the move right key
public String getMoveRight() {
    return rStr;
}

// Returns the string representation of the jump key
public String getJump() {
    return jStr;
}

// Returns the string representation of the attack key
public String getAttack() {
    return aStr;
}

// Returns the int representation of the attack key
public int getAttackInt(){
    return attack;
}
}

共 (1) 个答案

  1. # 1 楼答案

    如果我可以建议另一种方法的话,听起来你真正想要的是对你的闪电攻击进行冷却——如果玩家按下按钮,冷却可以防止它重复开火,它还可以让你控制玩家在敲击键盘时可以以多快的速度发射它(你可能希望玩家在未来将闪电攻击“升级”到更快的速度)

    我在下面举了一个例子:

    public class Cooldown {
        private float cooldownTime = 0;
        private float length = 0;
        private Action action;
    
        public Cooldown(float length, Action action) {
            this.length = length;
            this.action = action;
        }
    
        public boolean update(float delta) {
            // Subtract the delta until we hit 0
            this.cooldownTime = this.cooldownTime - delta <= 0 ? 0 : this.cooldownTime - delta;
            // The boolean tells you that the cooldown has expired- useful for special effects
            return this.cooldownTime == 0;
        }
    
        public void execute() {
            if(this.cooldownTime > 0) return;
            this.cooldownTime = this.length;
            this.action.execute();
        }
    
        public interface Action {
            void execute();
        }
    }
    

    要使用这个类,只需在玩家的构造函数下添加如下内容:

    this.lighteningAttack = new Cooldown(0.25f, new LightningAttack());
    

    然后在你的游戏循环中:

    this.lighteningAttack.update(deltaTime);
    

    最后,在eventlistener中:

    this.lighteningAttack.execute();
    

    无论你按下按钮多少次,它一秒钟只能执行四次