android - 来自 texturepacker xml 的动画 Sprite

标签 android andengine texturepacker

一般来说是 android dev 和 andengine 的新手。尝试使用 AndEngineTexturePackerExtension 为 Sprite 制作动画,但我不确定如何为动画 Sprite 创建 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 的值从何而来? Sprite 表本身的行和列不均匀,因为它包括旋转的 Sprite 等。所以我对这些值的来源感到困惑。任何有助于使这项工作正常进行的帮助都将非常感谢

编辑:好的,如果我只使用纹理打包器中的基本算法而不是 MaxRects 算法,我可以让 Sprite 表动画工作。但这并没有利用工作表中的所有空间,所以我宁愿使用 MaxRects 生成的 Sprite 表来让它工作。我在 xml 中看到它传递了一个用于旋转或不旋转的 bool 值,所以有信息可以使这项工作正常进行,我只是不知道如何进行。当某些纹理在工作表上旋转时,我如何使用 texturepackertexture 区域制作动画 Sprite

最佳答案

TexturePacker 不知道您的 sprite 有多少列和行,即使它们是否平铺也不知道,它只是将所有内容打包到一个 spritesheet 中(例如 png 文件)。此外,它的目标不是从分离的 Sprites 创建 TiledSprites。

因此,为了从 spritesheet 中取回 TiledSprite(或 AnimatedSprite),您必须知道在将其放入spritesheet,因为 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 并不是用来创建平铺 Sprite 的。您必须使用 TexturePacker 创建您的平铺 Sprite (适合或行和列)。

关于android - 来自 texturepacker xml 的动画 Sprite ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12041756/

相关文章:

java - 在 Android 游戏逻辑中解锁关卡

libgdx - 将 Libgdx 和 TexturePacker 与 xxxdpi 图像一起使用会失真

lua - TexturePacker中的 "21 not fitting sprities try multipacking"指的是什么?

cmd - 纹理打包器命令行多图像

java - 使用新元素即时更新 Android SurfaceView

java - Unity 的 GCM 插件,找不到方法 GCMRegistrar.checkDevice

Android Studio 2 上的 Android NDK

android - Flutter Android 启动器图标看起来很小

android - java.lang.IndexOutOfBoundsException:无效的索引2,大小为2

android - 尝试启动并运行 andengine