1

我正在用AndEngine编写游戏,然后我将几十个精灵放入一个SpriteBatch 中。这需要完成,否则当我自己绘制每个精灵时,帧速率会急剧下降。我的问题是,如何更改完整SpriteBatch的颜色?

这就是我创建SpriteBatch的方式:

ArrayList<Sprite> dozenSprites; // these are all the sprites of one SpriteBatch in a list
SpriteBatch spriteBatch = new SpriteBatch(spriteBatchTextureAtlas, dozenSprites.size(),vertexBufferObjectManager);

for (Sprite sprite : dozenSprites) {
        spriteBatch.draw(sprite);
}
spriteBatch.submit();

好吧,没有什么特别的。一切准备就绪后,我将SpriteBatch附加到我的场景并按预期显示。但是,当我打电话时,spriteBatch.setColor(0.5f,0.5f,0.5f);什么也没有发生。仅当我在绘制SpriteBatch之前将颜色(...)设置为每个精灵时,颜色才会发生变化我 在这里做错了吗?还有其他方法吗?

每一个小提示都值得赞赏!谢谢你。

编辑:我的解决方案
正如Cameron Fredmans 所建议的(再次感谢!)我首先尝试SpriteBatch class直接扩展并实现该setColor()方法。但我不知道怎么做,所以我选择了快速而肮脏的变体:

 // initialize the SpriteBatch as above
 // and to change the color call:
 spriteBatch.reset();
 for (Sprite sprite : dozenSprites) {
        sprite.setColor( theNewColor );
        spriteBatch.draw(sprite);
 }
 spriteBatch.submit();

使用 spriteBatch 带来了更多的性能,保持 ArrayList 与所有原始精灵并每次重新初始化批处理对我来说仍然足够快。但是,当有人成功扩展 SpriteBatch 类时,我当然会非常感兴趣!:)

4

1 回答 1

2

尽管 SpriteBatch 有一个 setColor(),但这实际上只是它扩展 Shape 的产物。两种可能的解决方案:

(1) 分别为每个精灵着色。

ArrayList<Sprite> dozenSprites; // these are all the sprites of one SpriteBatch in a list
SpriteBatch spriteBatch = new SpriteBatch(spriteBatchTextureAtlas, dozenSprites.size(),vertexBufferObjectManager);

for (Sprite sprite : dozenSprites) {
        sprite.setColor(.5f, .5f, .5f);
        spriteBatch.draw(sprite);
}
spriteBatch.submit();       

(2)在AndEngine中修改SpriteBatch

如果您真的不想为每个精灵着色,那么如何修改 AndEngine 中的 SpriteBatch 类并添加一个覆盖 setColor() 的方法。向 spritebatch 添加一个颜色字段,让 setcolor 调整该字段,然后在 draw 方法中,让 spritebatch 将它正在绘制的精灵的颜色设置为其存储的颜色字段。

如果你在 AndEngine 中干净地实现它,你甚至可以将它作为对源的可能更改提交。(它是开源的。参与其中很有趣。)

于 2013-02-25T17:07:42.697 回答