为什么我的clicklistener不工作?

时间:2016-06-29 19:24:57

标签: java libgdx

这是我的代码

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

我不确定clicklistener为什么不能正常工作。我也尝试过使用touchDown方法,但它也不起作用。对不起,如果这听起来像一个愚蠢的问题,我对图书馆来说相当新鲜

1 个答案:

答案 0 :(得分:0)

只需要尝试两件事:我可以看到你在show方法中构建了按钮。为什么?在显示任何内容之前,拥有一个设置方法并构建应用程序/游戏/整个布局的设置方法更有意义。但这只是一个黑暗的镜头,我不知道你正在使用的这个框架,我可能是非常错误的。

当您保留同一游戏的多个实例时,另一件可能会导致问题的事情!注意一次只构建一次游戏,然后传递那个单一的实例。为什么这很重要?因为可能存在您正在调用game.setScreen( new GameScreen(game));但是在错误的实例上的情况!

请发布您的SpaceInvaderScreen,以便调试它可能更容易。

无论如何,您是否尝试过调试touchDown方法?它完全被召唤了吗?

还有两件事:ClickListener是一个类。不是界面。因此,当您重写touchDown方法时,您基本上绕过了超类中的父代码。

尝试调用作为触地得分方法的第一行:

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

ClickListener文档也说:

  

当返回true时,处理事件(...)这不会影响   在scene2d中传播事件,但会导致Stage事件方法   返回true,这将吃掉事件所以它不会被传递给   在舞台上申请。

所以你应该尝试返回false;