2016-06-29 20 views
0

Hier ist mein CodeWarum funktioniert mein Clicklistener nicht?

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

i mit dem clicklistener was los bin nicht sicher, warum es nicht funktioniert. Ich habe auch versucht, die TouchDown-Methode zu verwenden, aber es funktioniert auch nicht. Sorry, wenn das klingt wie eine dumme Frage, ich bin ziemlich neu in der Bibliothek

+0

Können Sie auch den Spiel-, GameScreen- und SpaceInvaderScreen-Code posten? –

Antwort

0

Nur zwei Dinge zu versuchen: Ich kann sehen, dass Sie den Button in der Show-Methode bauen. Warum? Es macht viel mehr Sinn, eine Setup-Methode zu haben und das gesamte Layout der Anwendung/des Spiels/was auch immer in dieser Setup-Methode vor zu erstellen. Aber das ist nur ein Schuss in die Dunkelheit, ich kenne diesen Rahmen nicht, den Sie verwenden, und ich könnte sehr gut falsch liegen.

Auch eine andere Sache, die Probleme verursachen könnte, wenn Sie mehrere Instanzen des gleichen Spiels behalten! Achten Sie darauf, das Spiel einmal und nur einmal zu erstellen, und übergeben Sie diese Einzelinstanz. Warum ist das wichtig? Weil es einen Fall geben kann, dass Sie game.setScreen(new GameScreen(game)); anrufen, aber auf der falschen Instanz!

Bitte posten Sie auch Ihre SpaceInvaderScreen, damit es leichter zu debuggen ist.

Und wie auch immer, haben Sie versucht, die touchDown Methode zu debuggen? Wird es überhaupt genannt?

Auch zwei weitere Dinge: ClickListener ist eine Klasse. Keine Schnittstelle. Wenn Sie also die Methode touchDown überschreiben, umgehen Sie im Prinzip den übergeordneten Code der Oberklasse.

Versuchen als die erste Zeile in der Aufsetzpunkt Methode aufrufen:

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

Auch die ClickListener Dokumentation sagt:

wenn true zurückgegeben wird, wird das Ereignis behandelt (...) Dies wirkt sich nicht auf Ereignisausbreitung innerhalb von scene2d aus, aber bewirkt, dass die Stage-Ereignismethoden true zurückgeben. Dadurch wird das Ereignis verzehrt, sodass es nicht an die -Anwendung weitergegeben wird ication unter der Bühne.

Sie sollten also versuchen, false zurückzugeben;

+0

Das Framework ist libgdx und die show-Methode wird aufgerufen, wenn Sie die Screen-Instanz aufrufen, also gewissermaßen eine Setup-Methode. Die Rendermethode ist diejenige, die aufgerufen und aktualisiert wird. – maziodyne

+0

Können Sie auch den Spiel-, GameScreen- und SpaceInvaderScreen-Code posten? –

+0

' importieren Sie com.badlogic.gdx.Spiel; öffentliche Klasse GameScreen erweitert SpaceInvaderScreen { \t \t Spiel Spiel; \t öffentliche GameScreen (Spiel Spiel) { \t \t Super (Spiel); \t} \t \t @Override \t public void show() { \t \t \t} \t \t @Override \t public void machen (float delta) { \t \t \t} \t \t @ Override \t public void hi de() { \t \t \t} } '' – maziodyne

Verwandte Themen