我正在进行一场塔防游戏,并且当涉及到随着等级的增加来确定更强大的怪物的健康时,我遇到了一个巨大的问题。我目前有健康设置为mobSize(我的意思是,健康栏与暴徒的大小成比例)。这显然不适用于更高级别,因为怪物保持相同的大小并变得更强,但我的draw()方法做到了这一点:
public void draw(Graphics g) {
if(inGame) {
if(Screen.level == 1){
g.drawImage(Screen.tileset_mob[1], x, y, width, height, null);
//Health Bar
g.setColor(new Color(180, 180, 50));
g.fillRect(x, y -(healthSpace + healthHeight) , width, healthHeight);
g.setColor(new Color(255, 0, 0));
g.fillRect(x, y -(healthSpace + healthHeight) , mobshealth , healthHeight);
g.setColor(new Color (0, 0, 0));
g.drawRect(x, y -(healthSpace + healthHeight), mobshealth - 1, healthHeight -1);
}
这显然只是从健康栏的宽度中移除,健康栏被设置为暴徒的健康状况。我的问题是,我希望制造一个更强壮的暴徒,随着等级的增加,它会从健康栏中带走更少的东西。有什么建议?非常感谢你!
答案 0 :(得分:3)
逻辑实体的属性应该与其可视化表示无关,而恰恰相反。
换句话说,你不应该关心任何与绘图或GUI有关的事情,而是让你的Mob类(逻辑类,而不是它的视觉表示)允许某些类型的强度乘数因子可以应用于它size属性,然后在其getStrength()
方法中返回。可视化表示将仅反映此方法返回的值。
即,:
// strengthScaleFactor is a double which increases at higher levels
public int getStrength() {
return (int) (getMobSize() * strengthScaleFactor);
}
暴徒力量的视觉表示,即“健康栏”,可以计算和使用归一化强度等级,即上述方法的结果除以返回最大力量的其他方法(getMaxStrength()
也许?)。
在这里一直思考MVC。
答案 1 :(得分:0)
想想MVC
//Model fields
//HP, MAXHP
//Controller method
float getHPPercent()
{
return HP/HPMax(float);
}
//View
int HPBoxWidthInPixels
Draw()
{
float percent = controller.getHPPercent();
Rect HPBox.x = Math.RoundToInt(HPBoxWidthInPixels *percent);
}