Я знаю, что многие вопросы были заданы, чтобы решить подобную проблему, но я не мог найти ответ на него.
Проблема: я сделал экран для своей игры 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****
Но цикл while в change() становится бесконечным, даже если я отпущу кнопку «меньше/ниже». Я также пробовал решение этого вопроса, но это также приводит к бесконечному циклу .
Также подробности моего проекта: (если они имеют значение):
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:
Переопределить метод действия
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 не запускается, а нижний флаг никогда не переключается на false.
Пожалуйста, скажите мне, что вызывает это неожиданное поведение и как обращаться с жестами нажатия и удержания так, как я хочу.
change()
не сработает, пока вы не отпустите кнопку. - person Tenfour04   schedule 28.09.2015