2
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。唯一的问题是旧的矩形永远不会被删除。我怎样才能有一个像这样的矩形来更新自己并删除旧的?

4

2 回答 2

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
 } 

它实际上和上面的方法一样,只是在最后一行稍微改变了一点,这使得矩形看起来更平滑一些......

于 2013-04-02T13:24:31.410 回答
0

要将孩子与 HUD 分离,您可以编写

    aHUD.detachChild(rectangle);

从 HUD 中清除所有孩子

aHUD.detachChildren();

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

 cCamera.getHUD().setCamera(null);

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

于 2013-04-02T04:50:55.147 回答