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
}
実際には上記の方法と同じですが、最後の行を少し変更するだけで、長方形がもう少しスムーズに表示されます...