2017-05-03 5 views
1

私はlibgdxライブラリを試しています。私は別の画面に移動するメニューを作っています。私はLwjglApplicationを使って小さなアプリケーションを作成します。最小化されたサイズのウィンドウを持つ場合、Clickイベントは正常に機能しますが、最大化の瞬間にイベントが機能しなくなります。クリックしてウィンドウを最大化またはリサイズ(LibGDX)するときにリスナーが機能しない

例:ここでは

、ClickListenerは enter image description here

を動作し、ここで... ClickListenerは動作を停止... enter image description here

メニューコード:

package mrbulb; 

import com.badlogic.gdx.Game; 
import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.Screen; 
import com.badlogic.gdx.graphics.Color; 
import com.badlogic.gdx.graphics.GL20; 
import com.badlogic.gdx.graphics.Texture; 
import com.badlogic.gdx.graphics.g2d.BitmapFont; 
import com.badlogic.gdx.scenes.scene2d.InputEvent; 
import com.badlogic.gdx.scenes.scene2d.Stage; 
import com.badlogic.gdx.scenes.scene2d.actions.Actions; 
import com.badlogic.gdx.scenes.scene2d.ui.Label; 
import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle; 
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; 

public class Menu implements Screen { 
    private Stage menu, sobre; 
    private ScreenBoss pantalla; 
    private Game juego; 

    public Menu(Game g){ 
     juego = g;  
     menu = new Stage(); 
     ActorBase fondo = new ActorBase(); 
     fondo.setTextura(new Texture(Gdx.files.internal("assets/fondo_temp.png"))); 
     fondo.setWidth(640); 
     fondo.setHeight(500); 
     menu.addActor(fondo); 
     LabelStyle style = new LabelStyle(new BitmapFont(),Color.ORANGE); 
     LabelStyle style2 = new LabelStyle(new BitmapFont(),Color.GREEN); 
     LabelStyle style3 = new LabelStyle(new BitmapFont(),Color.RED); 
     Label empezar = new Label("Empezar juego",style); 
     empezar.setFontScale(2); 
     empezar.setPosition(230, 250); 
     empezar.addAction(
     Actions.forever(Actions.sequence(Actions.color(new Color(1, 1, 0, 1), 0.5f),Actions.delay(0.5f),Actions.color(new Color(0.5f, 0.5f, 0, 1), 0.5f))) 
    ); 
     Label instrucciones = new Label("Como jugar",style); 
     instrucciones.setFontScale(2); 
     instrucciones.setPosition(250, 190); 
     instrucciones.addAction(
     Actions.forever(Actions.sequence(Actions.color(new Color(1, 1, 0, 1), 0.5f),Actions.delay(0.5f),Actions.color(new Color(0.5f, 0.5f, 0, 1), 0.5f))) 
    ); 
     Label acerca = new Label("Acerca de",style); 
     acerca.setFontScale(2); 
     acerca.setPosition(260,130); 
     acerca.addAction(
     Actions.forever(Actions.sequence(Actions.color(new Color(1, 1, 0, 1), 0.5f),Actions.delay(0.5f),Actions.color(new Color(0.5f, 0.5f, 0, 1), 0.5f))) 
    ); 
     acerca.addListener(new ClickListener(){ 
     @Override 
     public void clicked(InputEvent event, float x, float y){ 
      juego.setScreen(new ScreenBoss(sobre)); 
      Gdx.input.setInputProcessor(sobre); 
     }; 
     }); 
     Label salir = new Label("Salir",style); 
     salir.setFontScale(2); 
     salir.setPosition(294, 70); 
     salir.addAction(
     Actions.forever(Actions.sequence(Actions.color(new Color(1, 1, 0, 1), 0.5f),Actions.delay(0.5f),Actions.color(new Color(0.5f, 0.5f, 0, 1), 0.5f))) 
    ); 
     menu.addActor(empezar); 
     menu.addActor(instrucciones); 
     menu.addActor(acerca); 
     menu.addActor(salir); 
     sobre = new Stage(); 
     ActorBase fondAc = new ActorBase(); 
     fondAc.setTextura(new Texture(Gdx.files.internal("assets/Foco.png"))); 
     fondAc.setWidth(640); 
     fondAc.setHeight(500); 
     sobre.addActor(fondAc); 
     Label leyenda = new Label("Este juego fue desarrollado por Daniel Phillips,\ncon meros fines educativos (o \"Autodidactas\")." 
       + "\nSe hizo con la intencion de explorar el vasto \nmundo del desarrollo de videojuegos, ademas\n" 
       + "de explorar las librerias LibGDX.\n\nEl juego esta desarrollado en el lenguaje JAVA.",style2); 
     leyenda.setFontScale(2); 
     leyenda.setPosition(10, 230); 
     Label regresa = new Label("Regresar a la pantalla anterior",style3); 
     regresa.setFontScale(2); 
     regresa.setPosition(130, 50); 
     regresa.addAction(
     Actions.forever(Actions.sequence(Actions.color(new Color(1, 1, 0, 1), 0.5f),Actions.delay(0.5f),Actions.color(new Color(0.5f, 0.5f, 0, 1), 0.5f))) 
    ); 
     regresa.addListener(new ClickListener(){ 
      @Override 
      public void clicked(InputEvent event, float x, float y){ 
       juego.setScreen(new ScreenBoss(menu)); 
       Gdx.input.setInputProcessor(menu); 
      } 
     }); 
     sobre.addActor(leyenda); 
     sobre.addActor(regresa); 
     Gdx.input.setInputProcessor(menu); 
    } 

    @Override 
    public void show() {} 

    @Override 
    public void render(float dt) { 
     menu.act(dt); 
     Gdx.gl.glClearColor(0.8f, 0.8f, 1, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     menu.draw(); 
    } 

    @Override 
    public void resize(int i, int i1) {} 
    @Override 
    public void pause() {} 
    @Override 
    public void resume() {} 
    @Override 
    public void hide() {} 
    @Override 
    public void dispose() {} 
} 

答えて

2

あなたはステージビューポートを更新する必要があります。

@Override 
public void resize(int width, int height) { 
    stage.getViewport().update(width,height); 
} 

タッチ/タッチポイントがActor範囲内にあるときにLabelsetFontScale(scale);を使用するときは、そのLabelのサイズを設定する必要がありますので、それは彼のフォントサイズだけではないActor境界を変更し、検出したクリック。 containerは、フォントを拡大する代わりに、必要に応じて、そのラベルとスケールコンテナの親として使用できます。

デバッグにstage.setDebugAll(true);を使用し、すべてのActor境界を確認することができます。

デフォルトでは、ステージのコンストラクタは、画面幅と高さがビューポートのワールド幅とワールドハイトとしてStretchViewportを使用します。 StretchViewportは、ターゲットを埋めるためにソースを拡大/縮小します。ソースが同じアスペクト比を保持しないようにするため、ビューポートのワールドワイドとワールドワイドが事前に定義された他のビューポートに適しています。私はExtendViewportを使用することを推奨します。なぜなら、ほとんどの場合、私たちの要件を満たすためです。

関連する問題