147 lines
4.2 KiB
TypeScript
147 lines
4.2 KiB
TypeScript
|
|
import { GTweener } from './GTweener';
|
||
|
|
import { Timer } from '../core/Timer';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* TweenManager
|
||
|
|
*
|
||
|
|
* Manages all active tweens and updates them.
|
||
|
|
*
|
||
|
|
* 管理所有活动的补间并更新它们
|
||
|
|
*/
|
||
|
|
export class TweenManager {
|
||
|
|
private static _activeTweens: GTweener[] = [];
|
||
|
|
private static _tweenPool: GTweener[] = [];
|
||
|
|
private static _totalActiveTweens: number = 0;
|
||
|
|
private static _lastTime: number = 0;
|
||
|
|
private static _inited: boolean = false;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Create a new tween
|
||
|
|
* 创建新补间
|
||
|
|
*/
|
||
|
|
public static createTween(): GTweener {
|
||
|
|
if (!TweenManager._inited) {
|
||
|
|
TweenManager.init();
|
||
|
|
}
|
||
|
|
|
||
|
|
let tweener: GTweener;
|
||
|
|
if (TweenManager._tweenPool.length > 0) {
|
||
|
|
tweener = TweenManager._tweenPool.pop()!;
|
||
|
|
} else {
|
||
|
|
tweener = new GTweener();
|
||
|
|
}
|
||
|
|
|
||
|
|
tweener._init();
|
||
|
|
TweenManager._activeTweens[TweenManager._totalActiveTweens++] = tweener;
|
||
|
|
|
||
|
|
return tweener;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Check if target is being tweened
|
||
|
|
* 检查目标是否正在被补间
|
||
|
|
*/
|
||
|
|
public static isTweening(target: any, propType?: any): boolean {
|
||
|
|
if (!target) return false;
|
||
|
|
|
||
|
|
for (let i = 0; i < TweenManager._totalActiveTweens; i++) {
|
||
|
|
const tweener = TweenManager._activeTweens[i];
|
||
|
|
if (tweener && tweener._target === target && !tweener._killed) {
|
||
|
|
if (!propType || tweener._propType === propType) {
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Kill all tweens on target
|
||
|
|
* 终止目标上的所有补间
|
||
|
|
*/
|
||
|
|
public static killTweens(target: any, complete?: boolean, propType?: any): boolean {
|
||
|
|
if (!target) return false;
|
||
|
|
|
||
|
|
let result = false;
|
||
|
|
for (let i = 0; i < TweenManager._totalActiveTweens; i++) {
|
||
|
|
const tweener = TweenManager._activeTweens[i];
|
||
|
|
if (tweener && tweener._target === target && !tweener._killed) {
|
||
|
|
if (!propType || tweener._propType === propType) {
|
||
|
|
tweener.kill(complete);
|
||
|
|
result = true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return result;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get tween for target
|
||
|
|
* 获取目标的补间
|
||
|
|
*/
|
||
|
|
public static getTween(target: any, propType?: any): GTweener | null {
|
||
|
|
if (!target) return null;
|
||
|
|
|
||
|
|
for (let i = 0; i < TweenManager._totalActiveTweens; i++) {
|
||
|
|
const tweener = TweenManager._activeTweens[i];
|
||
|
|
if (tweener && tweener._target === target && !tweener._killed) {
|
||
|
|
if (!propType || tweener._propType === propType) {
|
||
|
|
return tweener;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
private static init(): void {
|
||
|
|
TweenManager._inited = true;
|
||
|
|
TweenManager._lastTime = Timer.time;
|
||
|
|
Timer.add(TweenManager.update, TweenManager);
|
||
|
|
}
|
||
|
|
|
||
|
|
private static update(): void {
|
||
|
|
const currentTime = Timer.time;
|
||
|
|
let dt = currentTime - TweenManager._lastTime;
|
||
|
|
TweenManager._lastTime = currentTime;
|
||
|
|
|
||
|
|
if (dt > 100) {
|
||
|
|
dt = 100;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Convert to seconds
|
||
|
|
dt /= 1000;
|
||
|
|
|
||
|
|
let freePosStart = -1;
|
||
|
|
for (let i = 0; i < TweenManager._totalActiveTweens; i++) {
|
||
|
|
const tweener = TweenManager._activeTweens[i];
|
||
|
|
if (!tweener) {
|
||
|
|
if (freePosStart === -1) {
|
||
|
|
freePosStart = i;
|
||
|
|
}
|
||
|
|
} else if (tweener._killed) {
|
||
|
|
tweener._reset();
|
||
|
|
TweenManager._tweenPool.push(tweener);
|
||
|
|
TweenManager._activeTweens[i] = null as any;
|
||
|
|
|
||
|
|
if (freePosStart === -1) {
|
||
|
|
freePosStart = i;
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
if (!tweener._paused) {
|
||
|
|
tweener._update(dt);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (freePosStart !== -1) {
|
||
|
|
TweenManager._activeTweens[freePosStart] = tweener;
|
||
|
|
TweenManager._activeTweens[i] = null as any;
|
||
|
|
freePosStart++;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (freePosStart !== -1) {
|
||
|
|
TweenManager._totalActiveTweens = freePosStart;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|