2014-12-30 5 views
2

텍스트 버튼이 정상적으로 그려 지지만 (오류 또는 경고 없음) 마우스 클릭에는 응답하지 않습니다. 상황은 데스크톱 및 Android 빌드에서 동일합니다. 나는 그 결과에 대한 모든 주제를 읽고 따라 갔다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?LibGDX TextButton이 마우스 클릭에 응답하지 않습니다.

어쩌면 무대 개체에서 뭔가를 설정해야합니까?

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); 

내가 문제가 크기 조정 기능에서 카메라와 뷰포트 설정에 의한 것을 깨달았다 크기 조정 기능에

추가 라인은 트릭을했다. 해당 코드를 제거 (표준 스테이지 뷰포트에서 볼 수 있도록 단추 위치를 조정)하면 단추가 작동하기 시작했습니다.

하지만 카메라와 뷰포트를 사용하고 싶었습니다. 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

추가하여 클래스에이 도움이

public MenuScreen implements ApplicationListener 

희망을 만약 ApplicationListener를 구현 :

은 여기 내 MenuScreen 클래스 코드입니다.

+0

I에 대해 MenuScreen에 ApplicationListener를 구현했으나 불행히도 도움이되지 않았습니다. 또한 (이 화면을 실행하는) Game 클래스는 ApplicationListener를 구현합니다. – Christopher

관련 문제