来自TexturePacker XML的动画精灵

3

我是一个新手,对于安卓开发和AndEngine都不熟悉。我想使用AndEngineTexturePackerExtension来制作动画精灵,但是我不确定如何为动画精灵创建tiledTextureRegion。下面是我正在尝试的代码,这些代码来自指南和论坛中的其他帖子。我正在使用texturepacker创建xml、png和java文件。

private TexturePackTextureRegionLibrary mSpritesheetTexturePackTextureRegionLibrary;
private TexturePack texturePack;

 try
         {
                 TexturePackLoader texturePackLoader = new TexturePackLoader(activity.getTextureManager());
                 texturePack = texturePackLoader.loadFromAsset(activity.getAssets(), "spritesheet.xml");
                 texturePack.loadTexture();
                 mSpritesheetTexturePackTextureRegionLibrary = texturePack.getTexturePackTextureRegionLibrary();
         }
         catch (TexturePackParseException e)
         {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
         }

 TexturePackerTextureRegion textureRegion = mSpritesheetTexturePackTextureRegionLibrary.
                 get(spritesheet.00000_ID);

TiledTextureRegion tiledTextureRegion = TiledTextureRegion.create(texturePack.getTexture(),
                 textureRegion.getSourceX(), textureRegion.getSourceY(),
                 textureRegion.getSourceWidth() , textureRegion.getSourceHeight() ,
                 COLUMNS, ROWS);

AnimatedSprite sprite = new AnimatedSprite((activity.CAMERA_WIDTH - tiledTextureRegion.getWidth()) / 2,
                 (activity.CAMERA_HEIGHT - tiledTextureRegion.getHeight()) / 2,
                 tiledTextureRegion, activity.getVertexBufferObjectManager());

问题在于我不理解COLUMNS和ROWS的值是从哪来的?精灵表本身的行与列是不规则的,因为它包含旋转的精灵等。所以我很困惑这些值是怎么来的。如果有任何帮助使这个工作起来将会是非常好的,谢谢。
编辑:好吧,如果我只是使用纹理打包器中的基本算法而不是MaxRects算法,我就可以让精灵表动画工作。但这并没有充分利用表中的所有空间,所以我更愿意使用一个MaxRects生成的精灵表。我看到在xml中传递了一个布尔值,用于判断是否旋转,所以信息在那里,可以使它起作用,但我无法弄清楚如何使用texturepackertexture region制作一个动画精灵,当一些纹理在表上被旋转时。

我也曾遇到过这个问题。我禁用了Trim选项,并使用基本算法代替maxrects,现在一切都正常了。 - Mustafa
1个回答

4

TexturePacker不知道你的精灵有多少列和行,也不知道它们是否是平铺的,它只会把所有东西都打包到一个单独的精灵表中(例如png文件)。此外,它的目标不是从分离的Sprites创建TiledSprites。

因此,为了从精灵表中获得一个TiledSprite(或AnimatedSprite),你必须知道在被放入精灵表之前它有多少列和行(可以在某个地方硬编码),因为TexturePacker不会提供这种信息。

我个人使用一个类似于以下的TextureRegionFactory:

public class TexturesFactory {

    public static final String SPRITESHEET_DIR = "gfx/spritesheets/";
    public static final String TEXTURES_DIR = SPRITESHEET_DIR+"textures/";

    private TexturePack mTexturePack;
    private TexturePackTextureRegionLibrary mTextureRegionLibrary;

    /**
     * 
     * @param pEngine
     * @param pContext
     * @param filename
     */
    public void loadSpritesheet(Engine pEngine, Context pContext, String filename) {

        try {
            this.mTexturePack = new TexturePackLoader(
                    pEngine.getTextureManager(), TEXTURES_DIR).loadFromAsset(
                            pContext.getAssets(), filename);

            this.mTextureRegionLibrary = this.mTexturePack.getTexturePackTextureRegionLibrary();
            this.mTexturePack.getTexture().load();

        } catch (TexturePackParseException ex) {
            Log.e("Factory", ex.getMessage(), ex);
        }
    }

    public TextureRegion getRegion(int id) {
        return this.mTextureRegionLibrary.get(id);
    }

    public TiledTextureRegion getTiled(int id, final int rows, final int columns) {

        TexturePackerTextureRegion packedTextureRegion = this.mTextureRegionLibrary.get(id);

        return TiledTextureRegion.create(
                packedTextureRegion.getTexture(), 
                (int) packedTextureRegion.getTextureX(), 
                (int) packedTextureRegion.getTextureY(), 
                (int) packedTextureRegion.getWidth(), 
                (int) packedTextureRegion.getHeight(), 
                columns, 
                rows);
    }
}
编辑: 关于旋转的问题,它写在由TexturePacker生成的xml中,因此您可以通过调用来获取它。
TexturePackerTextureRegion packedTextureRegion = this.mTextureRegionLibrary.get(id);
packedTextureRegion.isRotated()

然后,您可以使用以下代码根据该值创建tiledTextureRegion:

TiledTextureRegion.create(
                packedTextureRegion.getTexture(), 
                (int) packedTextureRegion.getTextureX(), 
                (int) packedTextureRegion.getTextureY(), 
                (int) packedTextureRegion.getWidth(), 
                (int) packedTextureRegion.getHeight(), 
                columns, 
                rows,
                packedTextureRegion.isRotated());

此外,我希望您明确一点,TexturePacker并不适用于创建平铺精灵。在使用TexturePacker之前,您必须创建好您的平铺精灵(适应行和列的良好拟合)。


但是,TexturePacker并不会按行和列生成精灵表,因为它会旋转一些图像以使更多的图像适合于给定页面上。所以,即使对我来说硬编码一个值也是错误的,因为该表格的结构并非如此。 - glogic
等等,你的意思是在TexturePacker处理之前,我必须想象出纹理表的样子,并以此确定行和列吗? - glogic
我使用TexturePacker的免费版本,因此我的精灵没有旋转,并且我不知道这些信息是否写在生成的xml文件中。上面所说的意思是您可以在生成的xml文件中找到有关精灵的所有信息(位置、宽度/高度等),但您无法获得每个精灵的行/列数。因此,如果您打包了一个具有8列和2行的爆炸平铺精灵,它将不会写入您的xml文件中。当您从纹理打包器创建爆炸动画精灵时,您必须手动指示此爆炸是具有8列和2行的平铺精灵... - Michel-F. Portzert
我懂你的意思,我的问题也在于此。我的一些图像被旋转了,所以不能很好地排列在行和列中。真是让人沮丧。 - glogic
我觉得我爱你,伙计!它已经很好地处理了旋转的精灵,感谢你为我解决了这个问题,我在这里快疯了!只有最后一件事。假设动画没有填满我传入的行和列数的最后一行。目前它会显示空白,因为它试图从表格中显示空白的空间。有什么办法解决吗? - glogic
实际上,我通过对AndEngine进行更改来解决了这个问题,它接受帧数并以这种方式处理循环。再次感谢您的帮助,非常感激! - glogic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接