Libgdx ArrayList中的纹理区域无法绘制到屏幕

Libgdx ArrayList中的纹理区域无法绘制到屏幕,libgdx,Libgdx,我在LibGDX中使用spriteBatch绘制纹理区域时遇到一些问题 所以我有一个主类,它负责游戏逻辑。 在构造函数中,我有: atlas = new TextureAtlas(Gdx.files.internal("sheet.txt") ); this.loadTileGFX(); loadTileGFX方法执行以下操作: roseFrames = new ArrayList<AtlasRegion>(); roseFrames.add(atlas.findRegion("

我在LibGDX中使用spriteBatch绘制纹理区域时遇到一些问题

所以我有一个主类,它负责游戏逻辑。 在构造函数中,我有:

atlas = new TextureAtlas(Gdx.files.internal("sheet.txt") );
this.loadTileGFX();
loadTileGFX方法执行以下操作:

roseFrames = new ArrayList<AtlasRegion>();

roseFrames.add(atlas.findRegion("Dirt", 0));
roseFrames.add(atlas.findRegion("Dirt", 1));
roseFrames.add(atlas.findRegion("Dirt", 2));
roseFrames.add(atlas.findRegion("Dirt", 3));
然后,我调用的每个渲染循环:

batch.begin();
rose.draw(batch);
batch.end()
rose.draw方法如下所示:

public void draw(SpriteBatch batch){
    batch.draw(this.textureRegions.get(1), rect.x, rect.y, rect.width, rect.height);
}
但问题是,这不会把任何东西吸引到屏幕上

但事情是这样的。 如果我将代码更改为:

 public void draw(SpriteBatch batch){
    batch.draw(new TextureAtlas(Gdx.files.internal("sheet.txt")).findRegion("Dirt", 0)), rect.x, rect.y, rect.width, rect.height);
}
然后它正确地绘制。 有人能解释一下我可能犯了什么错误吗? 保持在明,我并没有得到任何错误,并没有画代码。 此外,我可以跟踪this.textureRegions.get1的详细信息,它们都是正确的


谢谢。

如果您需要绘制具有纹理的阵列,您可以这样做:

batch.begin();
for (Ground ground : groundArray){
    batch.draw(ground.getTextureRegion(), ground.x, ground.y);
}
batch.end();
如你所见,我在这里绘制纹理区域

你可以在我的答案和答案中查看相关课程和其他信息

回答德鲁的评论:

public TextureRegion customGetTextureRegion(int i){
    switch(i){
    case 1:  return atlas.findRegion("dirt1"); break;
    case 2:  return atlas.findRegion("dirt2"); break;
    case 3:  return atlas.findRegion("dirt3"); break;
    }
}

我已经找到了解决我自己问题的办法

我还画了一些调试shaperender的东西

问题似乎是libGDX不喜欢同时打开SpriteBatch和shaperender:

//LibGDX Doesn't like this:
spriteBatch.begin();

shapeRenderer.begin(ShapeType.Line);
shapeRenderer.drawRect(x, y, width, height);
shapeRenderer.end();

sprtieBatch.draw(texRegion, x, y, width, height);
spriteBatch.end();
它倾向于:

//LibGDX likes this:
shapeRenderer.begin(ShapeType.Line);
shapeRenderer.drawRect(x, y, width, height);
shapeRenderer.end();


spriteBatch.begin();
sprtieBatch.draw(texRegion, x, y, width, height);
spriteBatch.end();

感谢大家的回复。

在第一个步骤中,您将在第二个纹理区域中渲染AtlasRegion。我不确定那些是一样的。嗯?这可能是问题所在,但您在索引1的第一个代码中绘制了第二个纹理,但在索引0的第二个代码中绘制了第一个纹理。另外@Veljko不,对不起,这不是问题所在,我尝试了不同的索引……嗯,谢谢,但对不起,但这不是我想要做的。我并没有试图绘制一个rose对象数组,我只是试图绘制一个rose对象,它有一个TextureRegion数组,数组中有一个索引来指定每次调用时要绘制的对象。Rose类有一个表示动画每一帧的纹理区域数组。现在你想要的是更清楚的理解,你应该在你的问题中写出来。您可以编写定制的getTextureRegionint i方法,该方法根据传递给它的值选择并返回纹理区域,您将批量调用它;我会更新我的答案的。对不起,你是对的,我应该包括在内。你提供的也正是我正在做的。看看我的代码。问题并不是我不知道如何构造它,而是好像预先缓存TexureRegion,然后将其传递到对象中将不会绘制任何内容,而在对象内部初始化它将绘制它。不仅如此,我还可以跟踪传入纹理的属性高度、宽度、名称等,但当我绘制它时,不会显示任何内容。这是一个意外行为的案例,而不是我该怎么做。奇怪的是,它应该起作用。我看不出它不起作用的理由。无论何时初始化,TextureRegion都是TextureRegion。也许你可以用更多的代码更新你的答案?我觉得很奇怪,你把一个.txt文件传给了地图册。另外,您是否在.pack文件中检查了帧的索引是否正确?您知道必须将图像文件命名为name_index.png,例如rose_01.png。然后01转到index.Right。这就是我困惑的原因。回家后,如果可以的话,我会发布更多的代码,但命名不是问题,文本文件也不是问题。因为相同的代码findRegionDirt,0在Rose的draw方法中起作用,但如果我使用它并将找到的区域传入,则不起作用。
//LibGDX likes this:
shapeRenderer.begin(ShapeType.Line);
shapeRenderer.drawRect(x, y, width, height);
shapeRenderer.end();


spriteBatch.begin();
sprtieBatch.draw(texRegion, x, y, width, height);
spriteBatch.end();