分离孩子,更新和附加? AndEngine,Android

时间:2013-04-01 21:00:43

标签: android andengine

engine.registerUpdateHandler(new TimerHandler(0.2f,
            new ITimerCallback() {
                public void onTimePassed(final TimerHandler pTimerHandler) {
                    pTimerHandler.reset();
                    Rectangle xpRect = new Rectangle(30, 200,
                            (float) (((player.getXp()) / (player
                                    .getNextLevelxp())) * 800), 40, vbom);
                    HUD.attachChild(xpRect);
                }
            }));

到目前为止,我在createHUD方法中有这个。它非常简单,它创建一个矩形,显示玩家的xp与下一级所需的xp的关系,并将其附加到HUD。唯一的问题是永远不会删除旧矩形。我怎么能有一个像那个更新自己并删除旧矩形的矩形?

2 个答案:

答案 0 :(得分:2)

如果过于经常使用detachChild()或任何其他分离方法,您可能迟早会遇到问题。特别是因为分离只能在update thread上进行。你永远不会知道你的矩形何时会再次分离。因此,为了节省大量的附加和分离,重用矩形:

i)在某处保存Rectangle的引用(例如,在Player类中作为全局变量)。

ii)在开始加载你的东西时也初始化矩形:

 Rectangle xpRect = new Rectangle(30, 200, 0, 40, vbom);   // initialize it
 HUD.attachChild(xpRect);      // attach it where it belongs
 xpRect.setVisible(false);     // hide it from the player
 xpRect.setIgnoreUpdate(true); // hide it from the update thread, because you don't use it.

此时,放置矩形的位置或大小无关紧要。只有它在那里才是重要的。

iii)现在当你想向玩家展示他的XP时你只需要让它可见

 public void showXP(int playerXP, int nextXP){
     float width= (float) ((playerXP / nextXP) * 800);  // calculate your new width
     xpRect.setIgnoreUpdate(false);     // make the update thread aware of your rectangle
     xpRect.setWidth(width);            // now change the width of your rectangle
     xpRect.setVisible(true);           // make the rectangle visible again              
 } 

iv)当您不再需要它时:为了让它再次隐身,请致电

  xpRect.setVisible(false);     // hide it from the player
  xpRect.setIgnoreUpdate(true); // hide it from the update thread, because you don't 

当然,您现在可以使用showXP()方法,并在TimerHandler中使用它。如果你想要一个更有效的完整外观,你可以做这样的事情:

 public void showXP(int playerXP, int nextXP){
     float width= (float) ((playerXP / nextXP) * 800);  // calculate your new width
     xpRect.setIgnoreUpdate(false);                     // make the update thread aware of your rectangle
     xpRect.setWidth(width);                            // now change the width of your rectangle
     xpRect.setVisible(true); 

     xpRect.registerEntityModifier(new FadeInModifier(1f));  // only this line is new
 } 

它实际上与上面的方法相同,只是在最后一行稍有变化,这使得矩形看起来更平滑......

答案 1 :(得分:0)

要从HUD分离孩子,您可以写

    aHUD.detachChild(rectangle);

清除所有HUD儿童

aHUD.detachChildren();

要从相机中清除所有HUD,您可以写

 cCamera.getHUD().setCamera(null);

使用上述之一后,您可以创建一个HUD&也像往常一样附上。