如果您过于频繁地使用 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
}
它实际上和上面的方法一样,只是在最后一行稍微改变了一点,这使得矩形看起来更平滑一些......