为什么我的方法不能连续重复一个动作,直到按下 libgdx scene2d 按钮并在释放按钮时停止它?

Why doesn't my approach work to continuously repeat an action till a libgdx scene2d button is pressed and stop it when the button is released?

我知道有人问了很多问题来解决类似的问题,但我找不到答案。

问题: 我为我的 libgdx 游戏制作了一个屏幕,如下图所示。

我想通过触摸输入 only.When 我按住标有 'lower' 的按钮,它会减少中间的数字一次。我希望它一直递减,直到我释放 'lower' 按钮。 我已将按钮放在 table 中,然后将其添加到舞台上。为了实现我想要的,我使用了以下方法:

    TextButton less;   //for the button labeled 'lower'
    ....

***constructor start****
            stage = new Stage(new ScreenViewport());
            Gdx.input.setInputProcessor(stage);
            table = new Table();
            table.setFillParent(true);
            stage.addActor(table);
    ......
    ......
            style = new TextButton.TextButtonStyle();
            style.up = new TextureRegionDrawable(upRegion);
            style.down = new TextureRegionDrawable(downRegion);
            style.font = buttonFont;
            less = new TextButton("lower", style);
            table.add(less).expand().fill();
    ....
    ....
    less.addListener(new ChangeListener() {
     @Override
                public void changed(ChangeEvent event, Actor actor) {
                    while(less.isPressed()) {
                        Gdx.app.log("ispressed ","yes");
                        curLevel--;
                        level.setText("" + curLevel);
                        Gdx.app.log("curLevel: ",curLevel+"");
                        try{
                            Thread.sleep(1000);
                        }catch (Exception e){

                        }
                    }
                }
    }
....
....
***constructor ends****

但是即使我释放 "less/lower" changed() 中的 while 循环也会变得无限 按钮。我也尝试了 this 问题的解决方案,但这也会导致无限循环。

此外,我的项目详细信息是:(如果重要的话):

ext {
        appName = 'kombat'
        gdxVersion = '1.5.2'
        roboVMVersion = '1.0.0-beta-01'
        box2DLightsVersion = '1.3'
        ashleyVersion = '1.3.1'
        aiVersion = '1.4.0'
    }

我尝试了 gaRos 的解决方案,但结果是标签中的数字继续无限减少,即使在一次触摸和释放之后也是如此。这是我按照 gaRos 的指示所做的:

  1. 覆盖 act 方法

            package com.zeher.kombat;
            import com.badlogic.gdx.scenes.scene2d.ui.Skin;
            import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
            import com.zeher.kombat.Screens.LevelChooser;
            /**
               * Created by zucky on 10/4/2015.
            */
                public class LessButton extends TextButton {
                    LevelChooser lc;
                    public LessButton(String text,TextButton.TextButtonStyle skin,Kombat game) {
        super(text, skin);
        this.lc=game.introScreen.lc;
    
    }
    @Override
    public void act(float delta){
        if(lc.lowerFlag ) {
            lc.curLevel--;
            lc.level.setText("" + lc.curLevel);
        }
    
    }
    

    }

  2. 使用了 inputListener。

             less.addListener(new InputListener() {
        public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
            lowerFlag = true;
                return false;
            }
            public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
                lowerFlag = false;
                Gdx.app.log("occured: ","touchUp on less");
            }
        });
    

但问题是 touchUp 事件没有被触发并且 lowerFlag 永远不会切换到 false。

请告诉我是什么导致了这种意外行为,以及如何按照我想要的方式处理按住手势。

TextButton is an Actor, so you can set an InputListener 给它。

该接口有两个方法可以实现:

less.addListener(new InputListener() {
        public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
                lowerFlag = true;
                return true;
        }


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

并且您重写按钮的 act 方法并在标志为真时降低值。使用 delta 作为参数你想减少多快 curLevel.

(delta越大减的越多,delta越小减的越少)

首先感谢gaRos的提示

  1. 为此,我们应该与 actor 一起使用的侦听器是 ActorGestureListener。 应该是这样的:

    less.addListener(new ActorGestureListener() {
            public void touchDown(InputEvent event, float x, float y, int pointer, int button) {
                lowerFlag = true;
                Gdx.app.log("occured: ","touchDown on less"); //to test whether it works or not
            }
    
    
            public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
                lowerFlag = false;
                Gdx.app.log("occured: ","touchUp on less");
            }
    });
    
  2. 现在通过创建一个新的 class 来覆盖那个 'less' 按钮的 act 方法,它扩展了 TextButton 以便在标志为真时降低值。使用 delta 作为参数,您希望以多快的速度降低 curLevel。

(delta越大减的越多,delta越小减的越少)。例如我创建了 class LessButton.java.

    public class LessButton extends TextButton {
    LevelChooser lc;
    public LessButton(String text, TextButton.TextButtonStyle skin,Kombat game) {
        super(text, skin);
        this.lc=game.introScreen.lc;
    }
    @Override
    public void act(float delta){
        wait+=delta;
        if(lc.lowerFlag && lc.curLevel>0 && wait>delta*8) {
            lc.curLevel--;
            lc.level.setText("" + lc.curLevel);
            wait=0f;
        }
    }
    }

3。现在像这样使用它:

        LessButton less;
        ....
        less = new LessButton("lower", style,game);