AndEngine,Sprites没有正确订购

时间:2013-10-09 19:24:51

标签: java android andengine

我正在尝试将两个精灵附加到一个实体,但它们并没有按照我希望它们附加的顺序附加。

我希望avatarSprite能够在BarSprite的顶部,但无论我做什么它总是出现在barSprite后面。

我尝试设置ZIndex,更改我将它附加到实体的顺序,我甚至调用sortChildren,但它仍然以相同的顺序avatarSprite,并使用barSprite ontop。这是我正在使用的一些代码。


public class MyList extends Entity{
    public ArrayList<MyListItem> listItems;
    public ArrayList<Player> players;

    public MyList(ArrayList<Player> pList){
        super();
        listItems = new ArrayList<MyListItem>();
        players = pList;
        buildList();
        ...
        //set height and width
    }

    private void buildList(){
        float buffer = LIST_BUFFER;
        int i = 0;
        for(Player mPlayer : players){
            MyListItem mItem = new MyListItem(mPlayer);

            mPlayer.sprite.setTag(i);

            if (i == 0){
                mItem.setPosition(INITIAL_ITEM_X, INITIAL_ITEM_Y);
            } else{

            float x = listItems.get(i - 0).getX();
            float y = listItems.get(i - 0).getY() + mItem.getHeight() + buffer;

            mItem.setPosition(x,y);
           }

           attachChild(mItem);
           listItems.add(mItem);
           i++;
        }
    }


public class MyListItem extends Entity{
    private Player mPlayer;  

    public MyListItem(pPlayer){
        super();
        this.mPlayer = pPlayer;
        VertexBufferObjectManager vbom = MGA.getInstance().getVertexBufferObjectManager();
        Sprite barSprite = new Sprite( 0, 0, MGA.getInstance().mPlayerBar, vbom );

        Sprite avatarSprite = new Sprite( 0, 0, MGA.getInstance().mAvatarTextureRegion, vbom );
        avatarSprite.setScale( 3.0f );
        avatarSprite.setZIndex( 3 );


        float bWidth = barSprite.getWidth();
        float bHeight = barSprite.getHeight(); 

        barSprite.setX( bWidth / 2 );
        barSprite.setY( bHeight / 2 );
        barSprite.setZIndex( 2 );



        avatarSprite.setPosition( bWidth * 0.16058f, bHeight
            / 0.5f - avatarSprite.getHeight() / 2 );


        this.attachChild( barSprite );
        this.attachChild( avatarSprite );

        this.sortChildren( true );

        this.setHeight( bHeight );
        this.setWidth( bWidth );
    }
}

}

编辑: 我已经更新了代码以匹配我目前正在使用的代码。创建列表后,它将通过以下方式附加到HUD: myList = new MyList(players); attachChild(myList);

我确信我正在正确地执行所有操作,因为同样适用于Rectangle,它将同一类扩展为SpriteShape - &gt; Entity

我错过了什么吗?

EDIT2: 我刚刚尝试再次使用Rectangle,我仍然遇到同样的问题......

2 个答案:

答案 0 :(得分:0)

你应该使用图层。

  1. 将图层创建为实体

    private Entity backgroundLayer = new Entity();
    private Entity foregroundLayer = new Entity();
    
  2. 将图层附加到场景

    scene.attachChild(backgroundLayer);
    scene.attachChild(foregroundLayer);
    // important note: backgroundLayer should be attached first so it will be at the bottom.
    
  3. 现在将精灵附加到图层

    backgroundLayer.attachChild(barSprite);
    foregroundLayer.attachChild(avatarSprite);
    

答案 1 :(得分:0)

哇......好吧..我修好了,这就是我做的:


旧:

...
avatarSprite.setPosition( bWidth * 0.16058f, bHeight
        / 0.5f - avatarSprite.getHeight() / 2 );
...

的变化:

...

avatarSprite.setPosition( bWidth * 0.16058f, bHeight
        * 0.5f - avatarSprite.getHeight() / 2 );
...

我所做的只是将/ 0.5f更改为* 0.5f

除以0.5我将高度乘以2,使y位置比我想要的高200px,使其出现在它上面的listItem下面。更正它将精灵放在正确的列表项中的正确位置。

由于我生成项目的方式,每个新项目都放在上一个项目之上。这就是为什么它似乎在酒吧精灵的下方。这是因为它在上面的层之下。