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() またはその他の detach メソッドを定期的に使用しすぎると、遅かれ早かれ問題が発生する可能性があります。特に、デタッチは でのみ行うことができるため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 に答える