对android开发和andengine来说是个新手。尝试使用andenginetexturepacker扩展设置精灵的动画,但我不确定如何为动画精灵创建tilettextureregion。下面是我在这个论坛上从指南和其他帖子中得到的尝试。从TraceEclipse中创建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());

问题是我不明白列和行的值是从哪里来的?精灵工作表本身有不均匀的行和列,因为它包括旋转的精灵等,所以我混淆了这些值的来源。如果能帮上忙就好了谢谢
编辑:好的,我可以让精灵工作表动画,如果我只是使用基本算法纹理包装,而不是maxrects算法。但这并没有充分利用工作表中的所有空间,所以我宁愿使用maxrects生成的sprite工作表。我在XML中看到它传递了一个布尔值,用于旋转或不旋转,所以信息就在那里,使这个工作我只是不知道如何进行。当一些纹理在工作表上旋转时,如何使用纹理包纹理区域制作动画精灵

最佳答案

texturepacker不知道有多少列和行有您的精灵,即使它们是否平铺,它只是将所有内容打包成一个精灵表(例如png文件)。而且,它的目标不是从分离的精灵创建平铺的精灵。
因此,为了从spritesheet中取回平铺的sprite(或动画的sprite),在放入spritesheet之前,您必须知道它有多少列和行(可以在某个地方硬编码),因为texturepacker不会给您此类信息。
我个人使用的是一个纹理区域工厂,它看起来像这样:

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.create(
                packedTextureRegion.getTexture(),
                (int) packedTextureRegion.getTextureX(),
                (int) packedTextureRegion.getTextureY(),
                (int) packedTextureRegion.getWidth(),
                (int) packedTextureRegion.getHeight(),
                columns,
                rows,
                packedTextureRegion.isRotated());

另外,我希望你能清楚地知道,texturepacker不是用来创建平铺精灵的。在使用TexturePacker之前,必须创建平铺的精灵(很适合或行和列)。

10-08 17:08