为什么我的方法不能连续重复一个动作,直到按下 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 的指示所做的:
覆盖 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);
}
}
}
使用了 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的提示
为此,我们应该与 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");
}
});
现在通过创建一个新的 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);
我知道有人问了很多问题来解决类似的问题,但我找不到答案。
问题: 我为我的 libgdx 游戏制作了一个屏幕,如下图所示。
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 的指示所做的:
覆盖 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); } }
}
使用了 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的提示
为此,我们应该与 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"); } });
现在通过创建一个新的 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);