1
0
Fork 0
spacetac/src/scripts/view/common/ValueBar.ts

98 lines
3.2 KiB
TypeScript

module SpaceTac.View {
"use strict";
// Display mode for ValueBar
export enum ValueBarMode {
Scaled,
Truncated
}
// Bar to display a value (like a progress bar)
export class ValueBar extends Phaser.Sprite {
// Display mode, true to scale the internal bar, false to truncate it
display_mode: ValueBarMode;
// Current value
private current: number;
// Maximal value
private maximal: number;
// Proportional value
private proportional: number;
// Sprite of internal bar (inside the background sprite)
private bar_sprite: Phaser.Sprite;
private bar_sprite_rect: Phaser.Rectangle;
// Create a quick standard bar
static newStandard(game: Phaser.Game, x: number, y: number): ValueBar {
var result = new ValueBar(game, x, y, "common-standard-bar-background");
result.setBarImage("common-standard-bar-foreground", 5, 5);
return result;
}
// Create a quick styled bar
static newStyled(game: Phaser.Game, base_key: string, x: number, y: number): ValueBar {
var result = new ValueBar(game, x, y, base_key + "-empty");
result.setBarImage(base_key + "-full");
return result;
}
// Build an value bar sprite
// background is the key to the image to use as background
constructor(game: Phaser.Game, x: number, y: number, background: string,
display_mode: ValueBarMode = ValueBarMode.Truncated) {
super(game, x, y, background);
this.display_mode = display_mode;
this.setValue(0, 1000);
}
// Set an image to use for the bar
setBarImage(key: string, offset_x: number = 0, offset_y: number = 0): void {
this.bar_sprite = new Phaser.Sprite(this.game, offset_x, offset_y, key);
this.bar_sprite_rect = new Phaser.Rectangle(0, 0, this.bar_sprite.width, this.bar_sprite.height);
this.addChild(this.bar_sprite);
}
// Update graphics representation
update() {
if (this.bar_sprite) {
var dest = this.proportional;
if (dest < 0.00001) {
dest = 0.00001;
}
if (this.display_mode === ValueBarMode.Scaled) {
this.game.tweens.create(this.bar_sprite.scale).to({x: dest}).start();
} else {
// TODO Animate
this.bar_sprite.crop(Phaser.Rectangle.clone(this.bar_sprite_rect).scale(dest, 1.0), false);
}
}
}
// Set current value
setValue(current: number, maximal: number = -1) {
this.current = current;
if (maximal >= 0) {
this.maximal = maximal;
}
if (this.maximal === 0) {
this.proportional = 0;
} else {
this.proportional = this.current / this.maximal;
}
this.update();
}
// Get the proportional (in 0.0-1.0 range) value
getProportionalValue(): number {
return this.proportional;
}
}
}