Java 未绘制的舞台

Java 未绘制的舞台,java,libgdx,stage,scene2d,Java,Libgdx,Stage,Scene2d,我想弄清楚为什么这不管用 我只是想整理一个基本的选项菜单,由于某种原因,舞台似乎没有吸引演员 我试着把同样的演员创作代码放到另一个有工作阶段的项目中,它画得很好,我仔细检查了这个项目和工作项目,寻找我遗漏的任何东西,据我所知,工作代码中与阶段相关的所有东西也在这个项目中,然而,我用这个OptionsScreen.java得到的只是一个空白的黑屏 下面是有问题的java文件OptionsScreen.java package com.kittykazoo.screens; import com.

我想弄清楚为什么这不管用

我只是想整理一个基本的选项菜单,由于某种原因,舞台似乎没有吸引演员

我试着把同样的演员创作代码放到另一个有工作阶段的项目中,它画得很好,我仔细检查了这个项目和工作项目,寻找我遗漏的任何东西,据我所知,工作代码中与阶段相关的所有东西也在这个项目中,然而,我用这个OptionsScreen.java得到的只是一个空白的黑屏

下面是有问题的java文件OptionsScreen.java

package com.kittykazoo.screens;

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.OrthographicCamera;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.Pixmap.Format;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.CheckBox;
import com.badlogic.gdx.scenes.scene2d.ui.CheckBox.CheckBoxStyle;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton.TextButtonStyle;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.badlogic.gdx.utils.viewport.StretchViewport;
import com.kittykazoo.gamehelpers.ScreenHandler;

public class OptionsScreen implements Screen {

    private ScreenHandler sh;

    private Stage stage;
    private Skin skin;

    private OrthographicCamera cam;
    private ShapeRenderer shapeRenderer;
    private SpriteBatch batch;

    private Label sfxVolValue;
    private Label musicVolValue;

    public OptionsScreen(ScreenHandler sh) {

        Gdx.app.log("OptionsScreen", "Attached");

        this.sh = sh;

        cam = new OrthographicCamera();
        cam.setToOrtho(true, 960, 600);

        shapeRenderer = new ShapeRenderer();
        shapeRenderer.setProjectionMatrix(cam.combined);
        batch = new SpriteBatch();
        batch.setProjectionMatrix(cam.combined);

        stage = new Stage();
        Gdx.input.setInputProcessor(stage);

        createOptions();

    }

    private void createOptions() {

        skin = new Skin();

        Pixmap pixmap = new Pixmap(100, 100, Format.RGBA8888);
        pixmap.setColor(Color.GREEN);
        pixmap.fill();

        skin.add("white", new Texture(pixmap));

        BitmapFont bfont = new BitmapFont();
        bfont.scale(1);
        skin.add("default", bfont);

        CheckBoxStyle checkBoxStyle = new CheckBoxStyle();
        checkBoxStyle.checkboxOff = skin.newDrawable("white", Color.WHITE);
        checkBoxStyle.checkboxOffDisabled = skin.newDrawable("white",
                Color.DARK_GRAY);
        checkBoxStyle.checkboxOn = skin.newDrawable("white", Color.WHITE);
        checkBoxStyle.checkboxOnDisabled = skin.newDrawable("white",
                Color.DARK_GRAY);
        checkBoxStyle.checked = skin.newDrawable("white", Color.WHITE);
        checkBoxStyle.font = skin.getFont("default");
        skin.add("default", checkBoxStyle);

        TextButtonStyle textButtonStyle = new TextButtonStyle();
        textButtonStyle.up = skin.newDrawable("white", Color.DARK_GRAY);
        textButtonStyle.down = skin.newDrawable("white", Color.DARK_GRAY);
        textButtonStyle.checked = skin.newDrawable("white", Color.BLUE);
        textButtonStyle.over = skin.newDrawable("white", Color.LIGHT_GRAY);
        textButtonStyle.font = skin.getFont("default");
        skin.add("default", textButtonStyle);

        final CheckBox checkBox = new CheckBox("Checkbox here", checkBoxStyle);
        checkBox.setPosition(100, 100);
        stage.addActor(checkBox);

        final TextButton textButton = new TextButton("UPDATE", textButtonStyle);
        textButton.setPosition(200, 200);
        stage.addActor(textButton);

        textButton.addListener(new ChangeListener() {
            public void changed(ChangeEvent event, Actor actor) {
                textButton.setText("Submitting...");
                sh.hideOptions();
            }
        });

    }

    @Override
    public void render(float delta) {

        // Black background
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        stage.act(Gdx.graphics.getDeltaTime());
        stage.draw();

    }

    @Override
    public void resize(int width, int height) {
        Gdx.app.log("OptionsScreen", "resizing");
        stage.setViewport(new StretchViewport(width, height));
    }

    @Override
    public void show() {
        Gdx.app.log("OptionsScreen", "show called");
    }

    @Override
    public void hide() {
        Gdx.app.log("OptionsScreen", "hide called");
    }

    @Override
    public void pause() {
        Gdx.app.log("OptionsScreen", "pause called");
    }

    @Override
    public void resume() {
        Gdx.app.log("OptionsScreen", "resume called");
    }

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

}
我想我一定错过了一些非常明显的东西。如果有人能告诉我哪里出了问题,我将非常感激

public void resize(int width, int height) {
    stage.setViewport(new StretchViewport(width, height));
}
这在许多方面是完全错误的。首先,您不希望在每次调整大小时都创建一个新的视口,因为存在垃圾收集器

此外,使用新的屏幕宽度和高度创建一个
StretchViewport
,会使StretchViewport变得无用,因为它的行为基本上类似于
ScreenViewport
。确保阅读以了解不同视口的工作方式

最后但并非最不重要的是,你的舞台没有被画出来的原因也隐藏在其中。UI
Stage
需要将摄影机居中,否则无法正确渲染

因此,您需要执行以下操作:

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

谢谢这就把它理顺了:)谢谢你的维基文章链接,我会通读一遍。