1
0
Fork 0
spacetac/src/view/common/Tools.ts

83 lines
2.6 KiB
TypeScript
Raw Normal View History

module SpaceTac.View {
// Common UI tools functions
export class Tools {
/**
* Setup a hover/hold/click routine on an object
*
* This should span the bridge between desktop and mobile targets.
*/
static setHoverClick(obj: Phaser.Button, enter: Function, leave: Function, click: Function, hovertime = 300, holdtime = 600) {
let holdstart = new Date();
let enternext = null;
let hovered = false;
obj.input.useHandCursor = true;
let prevententer = () => {
if (enternext != null) {
clearTimeout(enternext);
enternext = null;
}
};
obj.onInputOver.add(() => {
enternext = setTimeout(enter, hovertime);
hovered = true;
});
obj.onInputOut.add(() => {
prevententer();
leave();
hovered = false;
});
obj.onInputDown.add(() => {
holdstart = new Date();
enternext = setTimeout(enter, holdtime);
});
obj.onInputUp.add(() => {
prevententer();
if (new Date().getTime() - holdstart.getTime() < holdtime) {
click();
}
if (!hovered) {
leave();
}
});
}
// Constraint an angle in radians the ]-pi;pi] range.
static normalizeAngle(angle: number): number {
angle = angle % (2 * Math.PI);
if (angle <= -Math.PI) {
return angle + 2 * Math.PI;
} else if (angle > Math.PI) {
return angle - 2 * Math.PI;
} else {
return angle;
}
}
// Interpolate a rotation value
// This will take into account the 2*pi modulo
static rotationTween(tween: Phaser.Tween, dest: number, property: string = "rotation"): void {
// Immediately change the object's current rotation to be in range (-pi,pi)
var value = Tools.normalizeAngle(tween.target[property]);
tween.target[property] = value;
// Update the tween
dest = Tools.normalizeAngle(dest);
if (value - dest > Math.PI) {
dest += 2 * Math.PI;
} else if (value - dest < -Math.PI) {
dest -= 2 * Math.PI;
}
var changes: Object = {};
changes[property] = dest;
tween.to(changes);
}
}
}