我有一个使用纹理打包器应用程序创建的纹理表,它会删除所有不必要的透明像素,以节省最终纹理表中的空间。问题是我的动画是一个有剑的人,所以当他攻击时,他将剑挥过头顶,这意味着它会改变精灵的宽度和高度。实施例...
characterAttack1 = new TextureRegion(texture, 863, 979, 152, 149);
//more animation frames...
characterAttack8 = new TextureRegion(texture, 1, 2, 340, 256);
正如您所看到的,第一帧是152x149,但是到了第8帧,它现在是340x256。 因此,当动画运行时,如果我在我的角色类中使用正常的getWidth()getHeight()方法,角色会在攻击时缩小,因为随着剑摆动,攻击的高度和宽度会更大。另一方面,如果我使用该方法......
((TextureRegion)AssetLoader.characterAttack.getKeyFrame(runTime)).getRegionWidth();
and
((TextureRegion)AssetLoader.characterAttack.getKeyFrame(runTime)).getRegionHeight();
运行攻击动画时,角色会在屏幕上反弹。我知道我不可能是唯一一个遇到类似事情的人,但我似乎无法找到有关此事的任何信息。我唯一的做法是重新包装纹理文件,并使每个纹理文件的宽度和高度相同,即使最终打包纹理中有大量透明像素?
如果您需要查看AssetLoader和batcher.draw方法或其他任何我非常乐意提供代码示例,我只是想让帖子不要过大。谢谢。
答案 0 :(得分:1)
除非你想让你的游戏在内存极低的情况下运行,否则没有必要将纹理打包得那么紧。当你想到事物的大规模时,精灵表真的很小。我想你的游戏在运行时需要大约100MB的RAM,因为大多数计算机现在拥有超过4GB的内存,还有几个MB?
角色的精灵表应该是任何一个框架的最大尺寸。例如如果最大帧为340x256,则每帧必须为该大小。
现在角色每帧都处于相同的位置,因为渲染位置不会改变。
如果角色的中心总是在精灵的中间,你可以从图像的中心渲染,这将解决你的问题。