2014-12-30 3 views
2

Текстовая кнопка рисует нормально (никаких ошибок или предупреждений), но она не реагирует на щелчки мыши. Ситуация такая же, как у настольных компьютеров и Android. Я читал и следил за каждой темой о нем без каких-либо результатов. Что я делаю не так?LibGDX TextButton не отвечает на щелчки мыши

Возможно, мне нужно установить что-то в объекте сцены?

Вот мой MenuScreen класс код:

public class MenuScreen implements Screen { 
private OrthographicCamera camera; 
private BitmapFont font; 
private TextureAtlas menuGraphics; 

Stage stage; 
TextButton button; 
TextButtonStyle buttonStyle; 
Skin skin; 

public MenuScreen(Game game) 
{ 
    //create satage object 
    stage = new Stage(); 

    //create font object 
    font = new BitmapFont(Gdx.files.internal("data/arial-15.fnt"),false); 
    font.setColor(Color.RED); 

    //load buttons texture atlas and create Skin object 
    menuGraphics = new TextureAtlas(Gdx.files.internal("buttons/buttons.pack")); 
    skin = new Skin(); 
    skin.addRegions(menuGraphics); 

    // Store the default libgdx font under the name "defaultFont". 
    skin.add("defaultFont",font); 

    //Set button style 
    buttonStyle = new TextButtonStyle(); 
    buttonStyle.up = skin.newDrawable("yellow"); 
    buttonStyle.down = skin.newDrawable("orange"); 
    buttonStyle.checked = skin.newDrawable("orange"); 
    buttonStyle.over = skin.newDrawable("orange"); 
    buttonStyle.font = skin.getFont("defaultFont"); 

    skin.add("default", buttonStyle); 

    //assign button style 
    button=new TextButton("PLAY",buttonStyle); 
    button.setPosition(200, 200); 
    button.setSize(200,200); 


    //add button to stage 
    stage.addActor(button); 

    //add click listener to the button 
    button.addListener(new ClickListener() { 
     public void clicked(InputEvent event, float x, float y) { 
      button.setText("Starting new game"); 
      Gdx.app.log("MenuScreen", "clicked button"); 

     } 
    }); 

    Gdx.app.log("MenuScreen", "create"); 
} 

@Override 
public void resize(int width, int height) 
{ 
    float aspectRatio = (float) width/(float) height; 
    camera = new OrthographicCamera(640, 360); 
    camera.translate(320,180); 
    camera.update(); 

    stage.setViewport(new FillViewport(640, 360, camera)); 
    stage.getViewport().setCamera(camera); 

    Gdx.app.log("MenuScreen", "Resizing screen to: " + width + " x " + height); 
} 

@Override 
public void show() {  
    Gdx.input.setInputProcessor(stage); 

    float w = Gdx.graphics.getWidth(); 
    float h = Gdx.graphics.getHeight(); 

    resize((int)w,(int)h); 

    Gdx.app.log("MenuScreen", "Show screen code"); 
} 

@Override 
public void render(float delta) 
{ 
    Gdx.gl.glClearColor(0f, 1f, 0f, 1f); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

    stage.act(delta); 

    // draw the actors 
    stage.draw();  
} 

@Override 
public void dispose() 
{ 

} 

@Override 
public void pause() { 

} 

@Override 
public void resume() { 

} 

@Override 
public void hide() { 

} 

}

+0

Что об этом http://stackoverflow.com/questions/11373390/button-clicklistener-is-not-working-in-libgdx-game – nikoliazekter

ответ

3

Я, наконец, решил это!

Дополнительная строка в функции изменения размера сделал трюк:

stage.getViewport().update(width, height); 

я понял, что проблема была вызвана установкой камеры и Viewport в функции изменения размера. Когда я удалил этот код (отрегулировал положение кнопки, чтобы быть видимым со стандартным окном просмотра), кнопка начала работать.

Но я хотел использовать камеру и видовое окно. Чтение изменения размеров сцены в документации по LibGDX (https://github.com/libgdx/libgdx/wiki/Scene2d) Я узнал, что после настройки камеры необходимо обновить видовое окно, иначе актерские границы не будут пересчитаны. Поэтому я добавил строку обновления видового экрана в функцию изменения размера и начал работать!

Новая функция изменения размера выглядит следующим образом:

@Override 
public void resize(int width, int height) 
{ 
float aspectRatio = (float) width/(float) height; 
camera = new OrthographicCamera(640, 360); 
camera.translate(320,180); 
camera.update(); 

stage.setViewport(new FillViewport(640, 360, camera)); 
stage.getViewport().setCamera(camera); 

stage.getViewport().update(width, height); 

Gdx.app.log("MenuScreen", "Resizing screen to: " + width + " x " + height); 
} 
0

добавить реализует ApplicationListener к классу

public MenuScreen implements ApplicationListener 

надеюсь, что это помогает.

+0

I Внедренный ApplicationListener в MenuScreen, как вы советовали, но, к сожалению, это не помогло. Кроме того, мой класс Game (который запускает этот экран) реализует ApplicationListener – Christopher

Смежные вопросы