【问题标题】:TextureRegion in ArrayList Won't draw to screenArrayList 中的 TextureRegion 不会绘制到屏幕上
【发布时间】:2014-08-20 00:55:41
【问题描述】:

我在 LibGDX 中使用 spriteBatch 绘制 TextureRegions 时遇到了一些问题。

所以我有一个承载游戏逻辑的主类。 在构造函数中,我有:

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));

然后我将 AtlasRegions 的 arrayList 传递给对象:

///in the main class
rsoe = new RoseSquare(roseFrames, st, col, row, tileWidth);

//in the constructor for the object to draw
this.textureRegions = roseFrames;

然后我调用的每个 render() 循环:

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.get(1)的细节,都是正确的......

谢谢。

【问题讨论】:

  • 在第一个方法中,您在第二个 TextureRegion 中渲染 AtlasRegion。我不确定那些是一样的。嗯?
  • 这可能是问题所在,但是您在第一个代码中绘制了第二个纹理(在索引1),但在第二个代码中绘制了第一个纹理(在索引0)。还有@Veljko AtlasRegion extends TextureRegion
  • 不,抱歉,这不是问题,我尝试了不同的索引.....hmmmm。

标签: libgdx


【解决方案1】:

如果你需要绘制一个包含纹理的数组,你可以这样做:

batch.begin();
for (Ground ground : groundArray){
    batch.draw(ground.getTextureRegion(), ground.x, ground.y);
}
batch.end();

如你所见,我在这里绘制 TextureRegion。

您可以在我的回答HEREHERE中查看相关课程和其他信息

回答画的评论:

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;
    }
}

【讨论】:

  • 谢谢,但很抱歉,但这不是我想要做的。我不是在尝试绘制一个玫瑰对象数组,而是在尝试绘制一个单一的玫瑰对象,该对象具有一个纹理区域数组,并带有一个索引来指定在每次调用时要绘制的对象。 Rose 类有一个 textureRegions 数组,代表动画的每一帧。
  • 现在你想要的东西更清楚了,你应该在你的问题中写下来。您可以编写自定义 getTextureRegion(int i) 方法,该方法根据您传递给它的值选择并返回纹理区域,您将在 batch.draw(rose.getTextureRegion(1),x,y); 中调用它我会更新我的答案。
  • 对不起,你是对的,我应该把它包括在内。此外,您提供的内容几乎正是我正在做的事情。看我的代码。问题不在于我不知道如何构造它,而是似乎预先缓存了 TexureRegion,然后将其传递给对象不会绘制任何内容,而在对象内部初始化它会绘制它。不仅如此,我还可以追踪传入纹理的属性(高度、宽度、名称等),但是当我绘制它时,什么都不会出现。这是一个意外行为的案例,而不是“我该怎么做”。
  • 奇怪,它应该可以工作。我认为它没有理由不起作用。 TextureRegion 是一个 TextureRegion,无论何时初始化它。也许您可以使用更多代码更新您的答案?我觉得您将 .txt 文件传递​​给 Atlas 很奇怪。另外,您是否在 .pack 文件中检查了您的框架确实具有正确的索引?您知道您必须将图像文件命名为 name_index.png,例如 rose_01.png。然后 01 进入索引。
  • 对。这就是为什么我很困惑。当我回到家时,如果可以的话,我会发布更多我的代码,但命名不是问题,文本文件也不是问题。因为相同的代码 findRegion("Dirt", 0) 在 Rose 的 draw() 方法中有效,但如果我使用它然后将找到的区域传递进去,则不会。
【解决方案2】:

我找到了解决我自己问题的方法。

我还画了一些调试 ShapeRenderer 的东西。

问题似乎是 libGDX 不喜欢 SpriteBatch 和 ShapeRenderer 同时“开启”:

//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();

感谢大家的回复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 2010-10-11
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    相关资源
    最近更新 更多