java - LibGDX Tiled (TMX) Maps + Scene2D,渲染两者时的错误
问题描述
所以我最近开始在 Java 中修改 LibGDX(目前仅限桌面)。我对其他语言的其他类型的 OGL 库(即 C++ 中的 SFML)有一定的经验,并且对 Java 语言本身也很有经验,所以我非常自信地处理了 LibGDX;虽然结果大多是积极的,但有一个我无法弄清楚的错误。
我想要实现的很简单:绘制一张地图(Tiled .tmx),在第 1 层和第 2 层之间绘制一个Sprite(即将成为“玩家”),并在所有这些之上渲染几个 GUI 小部件,使用一个场景2D舞台。我已经设法部分实现了这一点。
这是我的Game课程,它非常混乱,只是为了尝试而切换了这么多东西,但很清楚它试图做什么:
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);
}
}
现在这是交易;这就是尝试渲染所有内容时的样子(如我的 Game 类的render()方法所示):
播放器、GUI 和第 2 层渲染正确,但第 1 层全都出错了,我不知道为什么。
现在,如果 a 不渲染播放器,删除线,这就是它的样子
tiledMapRenderer.getBatch().draw(playerSprite, playerSprite.getX(), playerSprite.getY());
一切都很好。另外,如果我决定不渲染舞台演员,这就是它的样子,评论这个循环:
for(Actor a : stage.getActors())
a.draw(batch, 1);
同样,一切都很好。
我项目中唯一的其他类是默认的 DesktopLauncher 类,以及我确定与此无关的 InputProcessor。这是我在这里的第一个问题;我就是想不通。提前致谢。
解决方案
推荐阅读
- visual-studio - 如何隐藏/删除最大化,最小化和关闭按钮,但不是WPF窗口中的图标
- python-3.x - 如何多次将随机数生成到空列表中
- javascript - 如何在 JavaScript 中显示年龄(会员)计算器的结果?
- php - PHP 中的 fseek() 和 fwrite() 问题
- r - 使用 R 中的 lubridate 根据月份自动生成日期和小时
- flutter - 无法在颤动中进行映射
- javascript - 无法将未定义转换为对象
- pentaho - 如何在 linux 中使用数据参数执行 .ktr 文件(另一种转换)?
- laravel - 如何更正下图中的错误?
- java - 尝试获取与设定时区相比的本地时区