簡體   English   中英

如何使這個libGDX階段/按鈕接收觸摸?

[英]How to make this libGDX stage/Button receive touches?

我可以渲染“圖像”和“按鈕”小部件,但是,尚未成功獲得buttonPlay來接收輸入。 該假設是由於按鈕的向下圖像在觸摸時未呈現,並且onPlayClicked()也未執行的結果。

我相信我已經適當地將舞台設置為InputProcessor。

我已經詳盡地搜索了SO的解決方案,但無濟於事。

有問題的Button是ScreenMenuMain.java的buildControlsLayer()中的buttonPlay。

編輯 :屏幕流程:我想從ScreenMenuMain.java切換到另一個名為ScreenGame.java的屏幕。

我正在嘗試通過DirectedGame.java來執行此操作,它可以控制屏幕切換。 它還添加了過渡效果,使上一階段的輸入處理器無效,並將輸入處理器設置為新屏幕的階段。

ScreenMenuMain.java

    public class ScreenMenuMain extends AbstractGameScreen {

    private Stage           stage;
    private Skin            skinMenuMain;

    //menu
    private Image           menuLogo;
    private Button          buttonPlay;

    public ScreenMenuMain (DirectedGame game) {
        super(game);
    }

    @Override
    public void render (float deltaTime) {
        Gdx.gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        stage.act(deltaTime);
        stage.draw();
    }

    @Override
    public void resize (int width, int height) {
        stage.setViewport(Constants.VIEWPORT_GUI_WIDTH, Constants.VIEWPORT_GUI_HEIGHT, false);
    }

    @Override
    public void show () {
        stage = new Stage();
        rebuildStage();
    }

    @Override
    public void hide () {
        stage.dispose();
        skinMenuMain.dispose();
    }

    private void rebuildStage () {
        skinMenuMain = new Skin(Gdx.files.internal(Constants.SKIN_MAINMENU), new TextureAtlas(Constants.TEXTURE_ATLAS_MAINMENU));

        // build all layers
        Table layerLogo = buildLogoLayer();
        Table layerControls = buildControlsLayer();

        // assemble stage for menu screen
        stage.clear();
        Stack stack = new Stack();
        stage.addActor(stack);
        stack.setSize(Constants.VIEWPORT_GUI_WIDTH, Constants.VIEWPORT_GUI_HEIGHT);
        stack.add(layerLogo);
        stack.add(layerControls);
    }

    private Table buildLogoLayer () {
        Table layer = new Table();
        layer.top();
        // + Logo
        menuLogo = new Image(skinMenuMain, "menulogo");
        layer.add(menuLogo);
        layer.row().expandY();
        return layer; 
    }

    private Table buildControlsLayer () {
        Table layer = new Table();
        layer.left().bottom();
        //add play button
        buttonPlay = new Button(skinMenuMain, "play"); 
        layer.add(buttonPlay);
        buttonPlay.addListener(new ChangeListener() {
            @Override
            public void changed (ChangeEvent event, Actor actor) {
                System.out.println("touch down");
                onPlayClicked();
            }
        });         

        return layer;
    }

    private void onPlayClicked () {
        ScreenTransition transition = ScreenTransitionFade.init(0.75f);
        game.setScreen(new ScreenGame(game), transition);
    }

    @Override
    public InputProcessor getInputProcessor () {
        return stage;
    }
}

DirectedGame.java [用於設置InputProcessor和切換屏幕]

    public abstract class DirectedGame implements ApplicationListener {

    private boolean init;
    private AbstractGameScreen currScreen;
    private AbstractGameScreen nextScreen;
    private FrameBuffer currFbo;
    private FrameBuffer nextFbo;
    private SpriteBatch batch;
    private float t;
    private ScreenTransition screenTransition;

    public void setScreen (AbstractGameScreen screen) {
        setScreen(screen, null);
    }

    public void setScreen (AbstractGameScreen screen, ScreenTransition screenTransition) {
        int w = Gdx.graphics.getWidth();
        int h = Gdx.graphics.getHeight();
        if (!init) {
            currFbo = new FrameBuffer(Format.RGB888, w, h, false);
            nextFbo = new FrameBuffer(Format.RGB888, w, h, false);
            batch = new SpriteBatch();
            init = true;
        }
        // start new transition
        nextScreen = screen;
        nextScreen.show(); // activate next screen
        nextScreen.resize(w, h);
        nextScreen.render(0); // let next screen update() once
        if (currScreen != null) currScreen.pause();
        nextScreen.pause();
        Gdx.input.setInputProcessor(null); // disable input
        this.screenTransition = screenTransition;
        t = 0;
    }

    @Override
    public void render () {
        // get delta time and ensure an upper limit of one 60th second
        float deltaTime = Math.min(Gdx.graphics.getDeltaTime(), 1.0f / 60.0f);
        if (nextScreen == null) {
            // no ongoing transition
            if (currScreen != null) currScreen.render(deltaTime);
        } else {
            // ongoing transition
            float duration = 0;
            if (screenTransition != null) duration = screenTransition.getDuration();
            t = Math.min(t + deltaTime, duration);
            if (screenTransition == null || t >= duration) {
                // no transition effect set or transition has just finished
                if (currScreen != null) currScreen.hide();
                nextScreen.resume();
                // enable input for next screen
                Gdx.input.setInputProcessor(nextScreen.getInputProcessor());
                // switch screens
                currScreen = nextScreen;
                nextScreen = null;
                screenTransition = null;
            } else {
                // render screens to FBOs
                currFbo.begin();
                if (currScreen != null) currScreen.render(deltaTime);
                currFbo.end();
                nextFbo.begin();
                nextScreen.render(deltaTime);
                nextFbo.end();
                // render transition effect to screen
                float alpha = t / duration;
                screenTransition.render(batch, currFbo.getColorBufferTexture(), nextFbo.getColorBufferTexture(), alpha);
            }
        }
    }

    @Override
    public void resize (int width, int height) {
        if (currScreen != null) currScreen.resize(width, height);
        if (nextScreen != null) nextScreen.resize(width, height);
    }

    @Override
    public void pause () {
        if (currScreen != null) currScreen.pause();
    }

    @Override
    public void resume () {
        if (currScreen != null) currScreen.resume();
    }

    @Override
    public void dispose () {
        if (currScreen != null) currScreen.hide();
        if (nextScreen != null) nextScreen.hide();
        if (init) {
            currFbo.dispose();
            currScreen = null;
            nextFbo.dispose();
            nextScreen = null;
            batch.dispose();
            init = false;
        }
    }
}

您必須像這樣將InputListnener添加到您的按鈕

buttonPlay.addListener(new InputListener(){

        @Override
        public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
            System.out.println("touch down");
            onPlayClicked();
            return super.touchDown(event, x, y, pointer, button);
        }

        @Override
        public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
            // Do some stuff on touchUp
            super.touchUp(event, x, y, pointer, button);
        }

    });

還要檢查一下ClickListener: http ://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/utils/ClickListener.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM