Libgdx/Java继承问题
Libgdx/Java inheritance issue
我目前正在使用 libgdx 和 java 进行 android 项目,并且 运行 遇到了一个我不确定我在哪里的问题出错了。我有一个扩展小部件的基础 class。这个基础 class 有一个受保护的成员,它在每个派生 class 的 act() 方法中设置,但基础 statBar class 在它自己的 draw 方法中使用该成员。问题是,当调用 base class 方法时,成员为 0,而它不应该是。我错过了什么?
基础class:
public abstract class statBar extends Widget {
protected Color color;
protected Color darkColor;
protected Combatant character;
protected float currentFillWidth;
private Drawable fullBar;
privates Drawable emptyBar;
public statBar(Color color, Combatant character, Skin skin){
this.character = character;
this.color = color;
this.darkColor = color.cpy().mul(0,0,0,.2f);
this.fullBar = skin.newDrawable("statBar", this.color);
this.emptyBar = skin.newDrawable("statBar", this.darkColor);
}
@Override
public void draw(Batch batch, float parentAlpha) {
float x = getX();
float y = getY();
float width = getWidth();
float height = getHeight();
// draw current fill box
fullBar.draw(batch, x, y, currentFillWidth, height);
// if not full, draw empty bar portion
if (currentFillWidth < width) {
emptyBar.draw(batch, x+currentFillWidth, y, width-currentFillWidth, height);
}
}
}
派生 class:
public class HealthBar extends statBar {
public HealthBar(Combatant character, Skin skin) {
super(Color.RED, character, skin);
}
@Override
public void act(float delta) {
super.act(delta);
currentFillWidth = getWidth() * (character.getCurHP() / character.getMaxHP());
}
}
最后这就是我实例化栏的方式,它被添加到我屏幕上更大的 GUI table,但实际上其余的都是无关紧要的
ui.add(new HealthBar(c, skin));
c 是玩家队伍中角色的当前迭代。满血时一切都显示正常,但当你没有满血时,它会把栏画成空的。调试告诉我一个事实,当调用 base class draw 方法时,currentFillWidth 再次为 0,而它不应该为 0。关于基 class 方法未从派生 class 获取更新成员值的继承,我遗漏了什么?当我在 ui.draw 之前在渲染方法中调用 ui.act 时,Libgdx 调用作用于小部件。我什至尝试在派生的 class 中覆盖绘制并强制调用 super.draw。相同的结果。
从
中删除括号
currentFillWidth = getWidth() * (character.getCurHP() / character.getMaxHP());
所以
currentFillWidth = getWidth() * character.getCurHP() / character.getMaxHP();
我目前正在使用 libgdx 和 java 进行 android 项目,并且 运行 遇到了一个我不确定我在哪里的问题出错了。我有一个扩展小部件的基础 class。这个基础 class 有一个受保护的成员,它在每个派生 class 的 act() 方法中设置,但基础 statBar class 在它自己的 draw 方法中使用该成员。问题是,当调用 base class 方法时,成员为 0,而它不应该是。我错过了什么?
基础class:
public abstract class statBar extends Widget {
protected Color color;
protected Color darkColor;
protected Combatant character;
protected float currentFillWidth;
private Drawable fullBar;
privates Drawable emptyBar;
public statBar(Color color, Combatant character, Skin skin){
this.character = character;
this.color = color;
this.darkColor = color.cpy().mul(0,0,0,.2f);
this.fullBar = skin.newDrawable("statBar", this.color);
this.emptyBar = skin.newDrawable("statBar", this.darkColor);
}
@Override
public void draw(Batch batch, float parentAlpha) {
float x = getX();
float y = getY();
float width = getWidth();
float height = getHeight();
// draw current fill box
fullBar.draw(batch, x, y, currentFillWidth, height);
// if not full, draw empty bar portion
if (currentFillWidth < width) {
emptyBar.draw(batch, x+currentFillWidth, y, width-currentFillWidth, height);
}
}
}
派生 class:
public class HealthBar extends statBar {
public HealthBar(Combatant character, Skin skin) {
super(Color.RED, character, skin);
}
@Override
public void act(float delta) {
super.act(delta);
currentFillWidth = getWidth() * (character.getCurHP() / character.getMaxHP());
}
}
最后这就是我实例化栏的方式,它被添加到我屏幕上更大的 GUI table,但实际上其余的都是无关紧要的
ui.add(new HealthBar(c, skin));
c 是玩家队伍中角色的当前迭代。满血时一切都显示正常,但当你没有满血时,它会把栏画成空的。调试告诉我一个事实,当调用 base class draw 方法时,currentFillWidth 再次为 0,而它不应该为 0。关于基 class 方法未从派生 class 获取更新成员值的继承,我遗漏了什么?当我在 ui.draw 之前在渲染方法中调用 ui.act 时,Libgdx 调用作用于小部件。我什至尝试在派生的 class 中覆盖绘制并强制调用 super.draw。相同的结果。
从
中删除括号currentFillWidth = getWidth() * (character.getCurHP() / character.getMaxHP());
所以
currentFillWidth = getWidth() * character.getCurHP() / character.getMaxHP();