3

Android dev と 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 で、回転するかどうかを示す bool を渡すことがわかります。そのため、この作業を行うための情報がそこにあるため、方法がわかりません。一部のテクスチャがシート上で回転しているときに、texturepacker テクスチャ領域を使用してアニメーション化されたスプライトを作成する方法

4

1 に答える 1

4

TexturePacker は、スプライトがどれだけの列と行を持っているかを知りません。それらがタイル張りされているかどうかもわかりません。すべてを 1 つのスプライトシート (たとえば png ファイル) にパックするだけです。また、その目的は、分離された Sprites から TiledSprites を作成することではありません。

したがって、スプライトシートから TiledSprite (または AnimatedSprite) を取得するには、スプライトシートに配置される前にどれだけの列と行があったか (どこかにハードコードできます)を知る必要があります。情報の種類。

私は個人的に、次のような 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 を使用する前に、タイル化されたスプライト (適切なサイズまたは行と列) を作成する必要があります。

于 2012-08-20T17:04:11.550 に答える