class HealthBar { constructor(scene, name = "", width, height, x, y, valueMax, color, colorMin = COLOR_RED, middle = true) { this.bar = new Phaser.GameObjects.Graphics(scene); this.width = Math.floor(width); this.height = Math.floor(height); this.valueMax = valueMax; this.value = valueMax; this.color = color; this.colorMin = colorMin; this.bonus = []; this.draw(); scene.add.existing(this.bar); height = height - 4; let style = {font: height.toString() + 'px stencil', fill: "#000000"}; this.nameText = scene.add.text(x, y, name, style).setOrigin(0, 0); this.nameText.alpha = 0.5; this.setX(x, middle); this.setY(y); } addBonus(bonus) { if (bonus.value > 0) { this.bonus.push(bonus); } console.log(this.bonus); this.draw(); } removeBonus(bonus) { this.bonus.splice(this.bonus.indexOf(bonus), 1); this.draw(); } setValue(value) { if (value < 0) { value = 0; } if (value > this.valueMax) { value = this.valueMax; } if (value !== this.value) { this.value = value; this.draw(); } } getValue() { let value = this.value; this.bonus.forEach(bonus => value += bonus.value); return value; } setValueMax(valueMax = this.valueMax) { if (valueMax <= 0) { return; } let diff = valueMax - this.valueMax; this.valueMax = valueMax; this.setValue(this.value + diff); } decrease(amount) { let diff = amount; this.bonus.forEach(bonus => { diff = bonus.decrease(amount); if (diff > 0) { this.bonus.splice(this.bonus.indexOf(bonus), 1); } }); this.value -= diff; diff = 0; if (this.value < 0) { diff = -this.value; this.value = 0; } this.draw(); return diff; } increase(amount) { this.value += amount; if (this.value > this.valueMax) { this.value = this.valueMax; } this.draw(); } setX(x, middle = true) { if (middle) x = x - this.width / 2; this.bar.setX(x); this.nameText.setX(x + 5); } setY(y) { this.bar.setY(y); this.nameText.setY(y); } draw() { this.bar.clear(); // BG this.bar.fillStyle(0x000000); this.bar.fillRect(0, 0, this.width, this.height); // Health this.bar.fillStyle(0xffffff); this.bar.fillRect(2, 2, this.width - 4, this.height - 4); let valueMax = this.valueMax; this.bonus.forEach(bonus => valueMax += bonus.value); let percent = this.value / this.valueMax; if (percent < 1 / 3) { this.bar.fillStyle(this.colorMin); } else { this.bar.fillStyle(this.color); } percent = this.value / valueMax; let d = percent * (this.width - 4); this.bar.fillRect(2, 2, d, this.height - 4); let x = d + 2; this.bonus.forEach(bonus => { let percent = bonus.value / valueMax; this.bar.fillStyle(bonus.color); let width = percent * (this.width - 4); this.bar.fillRect(x, 2, width, this.height - 4); x += width; }); } destroy() { this.bar.destroy(); this.nameText.destroy(); } getJson() { let json = '{'; json += toJson("value", this.value) + toJson("valueMax", this.valueMax) + toJson("color", this.color) + toJson("colorMin", this.colorMin); json = endLineJson(json); json += '}'; return json; } setVisible(boolean) { this.bar.setVisible(boolean); this.nameText.setVisible(boolean); } }