2016-06-29 4 views
0

は、ここで私はそれが動作しない理由としてclicklistenerで起こっていただきましたわからないんだけど、私のコードなぜ私のクリックリスナーは機能していないのですか?

import com.badlogic.gdx.Game; 
import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.graphics.GL20; 
import com.badlogic.gdx.graphics.Texture; 
import com.badlogic.gdx.graphics.g2d.SpriteBatch; 
import com.badlogic.gdx.graphics.g2d.TextureRegion; 
import com.badlogic.gdx.scenes.scene2d.InputEvent; 
import com.badlogic.gdx.scenes.scene2d.Stage; 
import com.badlogic.gdx.scenes.scene2d.ui.Skin; 
import com.badlogic.gdx.scenes.scene2d.ui.TextButton; 
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; 
import com.badlogic.gdx.utils.viewport.FitViewport; 


public class MainMenuScreen extends SpaceInvaderScreen { 
    SpriteBatch batch; 
    TextureRegion background; 
    Stage stage; 
    TextButton playbutton; 
    float time = 0; 

    public MainMenuScreen(Game game){ 
     super(game); 
    } 

    @Override 
    public void show(){ 
     batch = new SpriteBatch(); 
     batch.getProjectionMatrix().setToOrtho2D(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
     background = new TextureRegion(new Texture("data/cool.jpg"), 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
     stage = new Stage(new FitViewport(1280, 1080)); 

     Skin uiskin = new Skin(Gdx.files.internal("data/skin/uiskin.json")); 

     playbutton = new TextButton("Play", uiskin); 
     playbutton.setWidth(200); 
     playbutton.setHeight(100); 
     playbutton.setPosition(980, 620); 
     playbutton.setBounds(playbutton.getX(), playbutton.getY(),  playbutton.getWidth(), playbutton.getHeight()); 
     playbutton.addListener(new ClickListener() {    
      @Override 
      public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { 
       game.setScreen(new GameScreen(game)); 
       return true; 
      }; 
     }); 
     stage.addActor(playbutton); 
     Gdx.input.setInputProcessor(stage); 
    } 

    @Override 
    public void render(float delta) { 
     Gdx.gl.glClearColor(0.15f, 0.15f, 0.2f, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     batch.begin(); 
     batch.draw(background, 0, 0); 
     batch.end(); 
     stage.act(); 
     stage.draw(); 

     time += delta; 

    } 

    @Override 
    public void hide(){ 
     batch.dispose(); 
     background.getTexture().dispose(); 
    } 
} 

です。私もtouchDownメソッドを使用しようとしましたが、どちらも動作しません。申し訳ありませんが、これは愚かな質問のように聞こえる場合は、ライブラリにかなり新しいです

+0

Game、GameScreen、SpaceInvaderScreenのコードも投稿できますか? –

答えて

0

私はあなたがshowメソッドでボタンを構築していることがわかります。どうして?セットアップ方法があり、アプリケーション/ゲームのレイアウト全体を構築するには、の設定方法で何かを表示する前に、が表示されているはるかに意味があります。しかし、これは暗闇の中での単なるショットです。あなたが使っているこのフレームワークを知らず、私は間違っているかもしれません。

また、同じゲームの複数のインスタンスを保持するときに問題を引き起こす可能性がある別のこと!ゲームを1回だけ構築し、その1つのインスタンスを周りに渡すことに注意してください。それはなぜ重要なのですか?あなたがgame.setScreen(new GameScreen(game));に電話しているが、間違ったインスタンスにある可能性があるためです!

SpaceInvaderScreenも同様に投稿してください。デバッグが容易になるかもしれません。

とにかく、touchDownメソッドをデバッグしようとしましたか?それはまったく呼ばれていますか?

さらに2つのもの:ClickListenerはクラスです。インタフェースではありません。したがって、touchDownメソッドをオーバーライドすると、基本的にスーパークラスの親コードをバイパスしています。タッチダウン方式での最初の行として呼び出す

試してみてください。

super.touchDown(event, x, y, pointer, button); 

ClickListenerドキュメントは言う:

返されたとき真、イベントが処理されました(...)これはシーン2d内の イベントの伝播には影響しませんが、Stageイベント・メソッド がtrueを戻すようにします。このイベントはイベントを食べて、 applに渡されませんステージの下での授業。

したがって、falseを返すようにしてください。

+0

フレームワークはlibgdxであり、画面インスタンスを呼び出すときにshowメソッドが呼び出されるため、ある意味ではセットアップメソッドです。レンダリングメソッドは、呼び出されて更新されるメソッドです。 – maziodyne

+0

Game、GameScreen、SpaceInvaderScreenのコードも投稿できますか? –

+0

' import com.badlogic.gdx。ゲーム; パブリッククラスGameScreenはSpaceInvaderScreenを拡張{ \t \tゲームゲーム; \t公共GameScreen(ゲームゲーム){ \t \tスーパー(ゲーム)。 \t} \t \t @Override \t公共ボイドショー(){ \t \t \t} \t \t @Override \t公共ボイドレンダリング(フロートデルタ){ \t \t \t} \t \t @オーバーライド \t public void hiド(){ \t \t \t} } '' – maziodyne

関連する問題