2013-08-27 2 views
2

Прямо сейчас я работаю над игрой, и я реализую панель здоровья. Я застрял, делая правильную формулу. Это мой код Худ вы видите на картинке:Vertical Healthbar

public class CharacterHUD { 

    private Image image; 
    private Player player; 

    private float xHealth, yHealth; 
    private float healthBarWidth, healthBarHeight; 
    private double healthBarY = 0; 
    private double multiplier; 

    public CharacterHUD(float xHealth, float yHealth, Image image, Player player) { 
     this.image = image; 
     this.player = player; 
     this.xHealth = xHealth; // X Offset from the frame, 20 in this case. 
     this.yHealth = yHealth; // Y Offset from the frame, 17 in this case. 
     healthBarWidth = 38; 
     healthBarHeight = 173; 
    } 

    public void update(int delta) { 
     healthBarY = (yHealth/100 * player.getHealth()); 
     multiplier = (yHealth/healthBarY); 
     Log.log("Percentage: " + multiplier); 
     Log.log("yHealth: " + yHealth + "+ Health: " + healthBarY); 
     Log.log("Actual yHealth: " + (healthBarHeight * multiplier)); 

    } 

    public void render(Graphics g) { 
     // The coordinates are going from top-left(x,y) to bottomright(width,height). Also, the yHealth is the offset from the frame. 
     Resources.healthBar.draw(xHealth, (float) (healthBarHeight/multiplier) + yHealth, healthBarWidth, (float) (healthBarHeight/multiplier)); 
     image.draw(0, 0); 
    } 

} 

На 50 здоровье это выглядит следующим образом:

So

На 75 здоровье это выглядит следующим образом:

So2

Что я делаю неправильно?

+0

Что такое «множитель»? – DerMike

+7

@ Dennisch Разве это не просто повторение проблемы OP? – millimoose

+0

Это помогло бы, если бы у вас были отдельные переменные для ограничивающей рамки панели «контейнер» и панели здоровья. Не совсем понятно, когда вы рисуете что-то, вы должны объяснить, что означают параметры 'draw()'. Кроме того, если 'Player.getHealth()' '' double'? Если вы не используете тот факт, что вы используете интегральное подразделение. – millimoose

ответ

1

Ваш расчет высоты бара назад. Я не знаю, в каком порядке находятся параметры в этом Resource.HealthBar или что они позволяют, но вот какой-то псевдокод для того, что вы хотите.

topLeft = (healthBarLeft, healthBarTop + (1 - healthPercent) * healthBarHeight) 
bottomRight = (healthBarLeft + healthBarWidth, healthBarTop + healthBarHeight) 

The (1 - healthPercent) означает, что если у вас есть 10% левого здоровья, бар начнет 90% пути вниз.

Edit: Если он не поддерживает TopLeft/bottomRight и вместо этого ожидает, ширина/высота, использование:

dimensions = (healthBarWidth, healthPercent * healthBarHeight) 
+1

Это путь для горизонтальной панели здоровья. Но это вертикальная, и координата X должна опускаться, когда здоровье становится ниже. –

+0

@TimondeGroot Um. Вы уверены, что это ** X ** (т. Е. Координата «слева»/«ширина»), которая должна идти ** ниже **? – millimoose

+0

Ох, я продолжаю испортить x и y: p. Я имел в виду Y. –

2

Будет ли

Resources.healthBar.draw(xHealth, (float) (healthBarHeight/multiplier) - yHealth, healthBarWidth, (float) (healthBarHeight/multiplier)); 

вместо + yHealth?

Примечание: Я не знаком с используемым методом, но похоже, что он использует координаты окна (слева вверху), что означает, что координата y, начиная с которой должна начинаться, должна уменьшаться по мере увеличения здоровья.

+1

Координаты идут от верхнего левого (x, y) до нижнего (ширина, высота). Кроме того, yHealth является смещением от кадра. –

+2

@TimondeGroot Эта информация относится к вопросу. То есть в комментариях рядом с параметрами 'draw()' – millimoose