Java LibGDX平铺(TMX)地图+;场景2D,渲染两者时出现错误

Java LibGDX平铺(TMX)地图+;场景2D,渲染两者时出现错误,java,libgdx,scene2d,tiled,Java,Libgdx,Scene2d,Tiled,所以我最近开始用Java修补LibGDX(目前仅限于桌面)。我对其他语言中的其他类型的OGL库(即C++中的SFML)有一定的经验,对Java语言本身也有一定的经验,所以我非常自信地处理了LibGDX;虽然结果大多是肯定的,但有一个bug我就是想不出来 我想要实现的很简单:绘制一张地图(平铺.tmx),在第1层和第2层之间绘制一个精灵(即将成为“玩家”),并在所有这些之上使用scene2Dstage渲染两个GUI小部件。我已经部分实现了这一点 这是我的游戏课程,它非常混乱,因为有太多的东西只是为

所以我最近开始用Java修补LibGDX(目前仅限于桌面)。我对其他语言中的其他类型的OGL库(即C++中的SFML)有一定的经验,对Java语言本身也有一定的经验,所以我非常自信地处理了LibGDX;虽然结果大多是肯定的,但有一个bug我就是想不出来

我想要实现的很简单:绘制一张地图(平铺.tmx),在第1层和第2层之间绘制一个精灵(即将成为“玩家”),并在所有这些之上使用scene2Dstage渲染两个GUI小部件。我已经部分实现了这一点

这是我的游戏课程,它非常混乱,因为有太多的东西只是为了尝试,但很清楚它试图做什么:

public class Game extends ApplicationAdapter 
{
    private SpriteBatch batch;
    private Texture img;
    private Sprite playerSprite;
    private TiledMap tiledMap;
    private OrthographicCamera camera;
    private OrthogonalTiledMapRenderer tiledMapRenderer;

    private Stage stage;

    @Override
    public void create () {
        batch = new SpriteBatch();
        img = new Texture("trchar000.png");
        playerSprite = new Sprite(img, 0, 0, 32, 48);

        playerSprite.setPosition(32, 192);

        InputHandler.init();
        Gdx.input.setInputProcessor(new InputHandler());

        stage = new TestStage(playerSprite);

        // inputs
        InputMultiplexer im = new InputMultiplexer(stage, new InputHandler());
        Gdx.input.setInputProcessor(im);

        // tiles
        camera = new OrthographicCamera();
        camera.setToOrtho(false, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        camera.update();
        tiledMap = new TmxMapLoader().load("map2.tmx");
        tiledMapRenderer = new OrthogonalTiledMapRenderer(tiledMap);
    }

    @Override
    public void render () {
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        camera.update();
        tiledMapRenderer.setView(camera);

        int[] groundLayers = {0};
        int[] topLayers = {1};

        // render layer1 -> player -> layer 2
        // the .tmx map doesn't have any other layers (just those 2)
        tiledMapRenderer.render(groundLayers);

        // removing these 3 lines solves the issue, but doesn't render the player
        // I've also tried using my regular SpriteBatch instance; same results
        // Also, I tried creating a class that extends OrthogonalTiledMapRenderer and overriding the render() method, so that it would draw the player inbetween layers, but again, same results.
        tiledMapRenderer.getBatch().begin();
        tiledMapRenderer.getBatch().draw(playerSprite, playerSprite.getX(), playerSprite.getY());
        tiledMapRenderer.getBatch().end();

        tiledMapRenderer.render(topLayers);

        batch.begin();

        // just to try, I'm rendering the stage here (not calling it's draw() method). Removing this for loop solves the issue, but doesn't render the GUI
        for(Actor a : stage.getActors())
            a.draw(batch, 1);

        batch.end();
    }

    @Override
    public void dispose () {
        batch.dispose();
        img.dispose();
        tiledMapRenderer.dispose();
        stage.dispose();
    }
}
另外,这是我的TestStage课程:

public class TestStage extends Stage {

    private Skin skin;
    private BitmapFont newDefaultFont;

    public TestStage(Sprite player)
    {
        super(new ScreenViewport());

        // skin
        FreeTypeFontGenerator freeTypeFontGenerator = new FreeTypeFontGenerator(Gdx.files.internal("segoeui.ttf"));
        FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter();
        parameter.size = 14;
        newDefaultFont = freeTypeFontGenerator.generateFont(parameter);

        skin = new Skin();
        skin.add("default-font", newDefaultFont, BitmapFont.class);
        FileHandle fileHandle = Gdx.files.internal("uiskin.json");
        FileHandle atlasFile = fileHandle.sibling("uiskin.atlas");

        if (atlasFile.exists()) {
            skin.addRegions(new TextureAtlas(atlasFile));
        }

        skin.load(fileHandle);

        final TextButton button = new TextButton("This is a Button", skin, "default");
        button.setPosition(250, 250);
        button.setWidth(150);
        button.setHeight(40);

        final Label lbl = new Label("Test", skin);

        this.addActor(lbl);
        this.addActor(button);
    }

}
现在是这样的交易;这是一个尝试渲染所有内容时的样子(如我的游戏类“render()方法中所示):

播放器、GUI和第2层的渲染是正确的,但第1层都出现了错误,我不知道为什么

现在,下面是如果a不渲染播放器,移除线的情况
tiledMapRenderer.getBatch().draw(playerSprite,playerSprite.getX(),playerSprite.getY())

一切都很好。 另外,如果我决定不渲染舞台演员,下面是它的样子,对这个循环进行了评论:

for(Actor a : stage.getActors())
    a.draw(batch, 1);

同样,一切都会变得很好

我的项目中唯一的其他类是默认的DesktopLauncher类和一个InputProcessor,我确信这与此无关。 这是我在这里的第一个问题;我就是搞不懂。
提前感谢。

舞台应该以不同的方式呈现。。。使用
stage.act();stage.draw()方法(而不是迭代舞台演员的循环)。我最初就是这样做的。同样的结果。