Android 来自多个精灵图纸的动画精灵

Android 来自多个精灵图纸的动画精灵,android,andengine,Android,Andengine,我是安卓开发人员的新手,使用安卓引擎,我刚刚遇到一个问题,当我处理一个大型动画时,它覆盖了一张以上的精灵表。基本上,我有一个大型精灵,它的动画在两张精灵表上运行。我试图找到一种方法来成功加载它们。我会告诉你我在尝试什么,希望有人能告诉我正确的方法或帮助我完成我的方式 我首先从xml文件创建两个纹理包开始。 这些都是精心制作的 TexturePackTextureRegionLibrary packer1 = null,packer2 = null; TexturePack spr

我是安卓开发人员的新手,使用安卓引擎,我刚刚遇到一个问题,当我处理一个大型动画时,它覆盖了一张以上的精灵表。基本上,我有一个大型精灵,它的动画在两张精灵表上运行。我试图找到一种方法来成功加载它们。我会告诉你我在尝试什么,希望有人能告诉我正确的方法或帮助我完成我的方式

我首先从xml文件创建两个纹理包开始。 这些都是精心制作的

TexturePackTextureRegionLibrary packer1 = null,packer2 = null;
        TexturePack spritesheetTexturePack1 = null,spritesheetTexturePack2 = null;
        try {
            spritesheetTexturePack1 = new TexturePackLoader(activity.getTextureManager(), "Animation/Jack/")
                    .loadFromAsset(activity.getAssets(), "Jack_walk1" + ".xml");
            spritesheetTexturePack1.loadTexture();
            packer1 = spritesheetTexturePack1.getTexturePackTextureRegionLibrary();
        } catch (final TexturePackParseException e) {
            Debug.e(e);
        }

        TexturePackerTextureRegion textureRegion = packer1.get(Jack_walk1.LOOP_JACK_WALK_TO_SAFE_AREA_00000_ID);

        try {
            spritesheetTexturePack2 = new TexturePackLoader(activity.getTextureManager(), "Animation/Jack/")
                    .loadFromAsset(activity.getAssets(), "Jack_walk2" + ".xml");
            spritesheetTexturePack2.loadTexture();
            packer2 = spritesheetTexturePack2.getTexturePackTextureRegionLibrary();
        } catch (final TexturePackParseException e) {
            Debug.e(e);
        }

        TexturePackerTextureRegion textureRegion2 = packer2.get(Jack_walk1.LOOP_JACK_WALK_TO_SAFE_AREA_00000_ID);


        ArrayList<SparseArray> animList = new ArrayList<SparseArray>();
        animList.add(packer1.getIDMapping());
        animList.add(packer2.getIDMapping());
        TiledTextureRegion text1 = TiledTextureRegion.create(textureRegion.getTexture(), (int) textureRegion.getTextureX(),  (int) textureRegion.getTextureY(), animList);
TexturePackTextureRegionLibrary packer1=null,packer2=null;
TexturePack SpriteSheetTextRepack1=null,SpriteSheetTextRepack2=null;
试一试{
spritesheetTexturePack1=新的TexturePackLoader(activity.getTextureManager(),“Animation/Jack/”)
.loadFromAsset(activity.getAssets(),“Jack_walk1”+“.xml”);
spritesheetTexturePack1.loadTexture();
packer1=spritesheetxturepack1.getTexturePackTextureRegionLibrary();
}捕获(最终TexturePackParse异常){
e(e);
}
TexturePackerTextureRegion textureRegion=packer1.get(Jack\u walk1.LOOP\u Jack\u WALK\u至安全区域\u00000\u ID);
试一试{
spritesheetTexturePack2=新的TexturePackLoader(activity.getTextureManager(),“Animation/Jack/”)
.loadFromAsset(activity.getAssets(),“Jack_walk2”+“.xml”);
spritesheetTexturePack2.loadTexture();
packer2=spritesheetxturepack2.getTexturePackTextureRegionLibrary();
}捕获(最终TexturePackParse异常){
e(e);
}
TexturePackerTextureRegion textureRegion2=packer2.get(Jack\u walk1.循环Jack\u WALK\u至安全区域\u00000\u ID);
ArrayList animList=新的ArrayList();
add(packer1.getIDMapping());
add(packer2.getIDMapping());
TiledTextureRegion text1=TiledTextureRegion.create(textureRegion.getTexture(),(int)textureRegion.getTextureX(),(int)textureRegion.getTextureY(),animList);
然后,我将此函数添加到tiledtextureregion,以获取包含帧信息的数组列表,并逐步将它们添加到iTextureRegion数组中

public static TiledTextureRegion create(final ITexture pTexture, final int pTextureX, final int pTextureY, final ArrayList<SparseArray> animList) {
        ITextureRegion[] textureRegions = null;
        int maxFrame = 0;

        for(int i = 0; i < animList.size(); i++){
            maxFrame += animList.get(i).size();
        }
        int currentFrame = 0;
        textureRegions = new ITextureRegion[maxFrame];
        for(int i = 0 ; i < animList.size(); i++){
            SparseArray<? extends ITexturePackTextureRegion> packer = animList.get(i);
            for(int j = 0; j < packer.size(); j++) {
                if (packer.valueAt(j)!= null){

                    final int x = (int) packer.valueAt(j).getTextureX();
                    final int y = (int) packer.valueAt(j).getTextureY();
                    final int width = packer.valueAt(j).getSourceWidth();
                    final int height = packer.valueAt(j).getSourceHeight();
                    final Boolean rotated = packer.valueAt(j).isRotated();


                    textureRegions[currentFrame] = new TextureRegion(pTexture, x, y, width, height, rotated);

                    currentFrame++;
                }
            }
        }


        return new TiledTextureRegion(pTexture, false, textureRegions);
    }
public static TiledTextureRegion创建(final ITexture pTexture、final int pTextureX、final int pTextureY、final ArrayList animList){
ITextureRegion[]textureRegions=null;
int maxFrame=0;
对于(int i=0;iSparseArray此类设计用于处理单个纹理

如果无法将纹理合并为一个纹理(我认为是这样),那么可以尝试编写一个新类来实现ITextureRegion,该类将包含2个或多个TiledTextureRegion对象,并且将有一个方法可以随意选择其中一个。 您只需将ITextureRegion的其余方法委托给所选对象即可

public class MultipleTextureRegion implements ITextureRegion {
  private List<TiledTextureRegion> internal;
  private int selected=0;

  //...

  public void add(TiledTextureRegion region) {
    internal.add(region);
  }

  public void select(int index) {
    selected=index;
  }

  //...

  // Delegates all ITextureRegion methods ...

  public int getWidth() { return internal.get(selected).getWidth(); }
  // And so on...
  }
公共类MultipleTextureRegion实现了ITextureRegion{
内部私有列表;
选择的私有int=0;
//...
公共空白添加(平铺文本区域){
内部。添加(区域);
}
公共无效选择(整数索引){
选定=索引;
}
//...
//委托所有ITextureRegion方法。。。
public int getWidth(){return internal.get(selected.getWidth();}
//等等。。。
}

然后我是否需要为处理此问题的动画精灵添加新的动画功能?或者精灵如何处理此新的纹理区域类型?嗯,是的,您必须重新定义处理精灵的方式(因为每次更改精灵时,您必须选择()正确的页面/纹理)。因此,恐怕有必要重写动画算法。我相信你可以想象一下我现在使用的多彩语言!:)谢谢你的帮助