tween24
Version:
Tween24.js is animation library that enables fast coding using method chains.
134 lines (120 loc) • 4.74 kB
text/typescript
import { ParamUpdater } from "./ParamUpdater";
import { Updater } from "./Updater";
export class ObjectUpdater implements Updater {
static className:string = "ObjectUpdater";
private _target :any;
private _keys :string[];
private _tweenKeys:string[]|null;
private _paramUpdaters:{[key:string]:ParamUpdater};
constructor(target:any) {
this._target = target;
this._keys = [];
this._tweenKeys = null;
this._paramUpdaters = {};
}
addProp(key:string, value:number, option:string|null = null) {
let updater;
if (option) {
updater = new ParamUpdater(key, this._target[key], value);
switch (option) {
case ParamUpdater.RELATIVE_AT_SETTING :
updater.set$value(value);
break;
case ParamUpdater.RELATIVE_AT_RUNNING :
updater.set$$value(value);
break;
}
}
else {
updater = new ParamUpdater(key, value, value);
}
this._paramUpdaters[key] = updater;
this._keys.push(key);
}
addPropStr(key:string, value:string) {
}
setBezier(bezierX:number, bezierY:number) {
const keyX:string = "x";
const keyY:string = "y";
if (!this._paramUpdaters[keyX]) {
this._paramUpdaters[keyX] = new ParamUpdater(keyX, this._target[keyX], NaN);
this._keys.push(keyX);
}
if (!this._paramUpdaters[keyY]) {
this._paramUpdaters[keyY] = new ParamUpdater(keyY, this._target[keyY], NaN);
this._keys.push(keyY);
}
this._paramUpdaters[keyX].setBezier(bezierX);
this._paramUpdaters[keyY].setBezier(bezierY);
}
init(useWillChange:boolean) {
this._tweenKeys = this._keys.concat();
for (const key of this._tweenKeys) {
if (key == "x") this._paramUpdaters.x.init(this._target.x);
else if (key == "y") this._paramUpdaters.y.init(this._target.y);
else if (key == "z") this._paramUpdaters.z.init(this._target.z);
else
this._paramUpdaters[key].init(this._target[key]);
}
}
update(progress:number) {
if (this._tweenKeys) {
for (const key of this._tweenKeys) {
if (key == "x") this._target.x = this._paramUpdaters.x.update(progress);
else if (key == "y") this._target.y = this._paramUpdaters.y.update(progress);
else if (key == "z") this._target.z = this._paramUpdaters.z.update(progress);
else
this._target[key] = this._paramUpdaters[key].update(progress);
}
}
}
overwrite(updater:ObjectUpdater):void {
if (this._target == updater._target) {
const targetKey:string[]|null = updater._tweenKeys;
if (this._tweenKeys && targetKey) {
for (const key of targetKey) {
const i = this._tweenKeys.indexOf(key);
if (i > -1) this._tweenKeys.splice(i, 1);
}
}
}
}
getMaxAbsDelta():number {
const deltas:number[] = [];
let dx:number = 0;
let dy:number = 0;
let dz:number = 0;
for (const key in this._paramUpdaters) {
if (key == "x") dx = this._paramUpdaters.x.getDelta();
else if (key == "y") dy = this._paramUpdaters.y.getDelta();
else if (key == "z") dz = this._paramUpdaters.z.getDelta();
else
deltas.push(Math.abs(this._paramUpdaters[key].getDelta()));
}
deltas.push(Math.sqrt(dx * dx + dy * dy + dz * dz));
return Math.max(...deltas);
}
clone(target:any = this._target):ObjectUpdater {
const copy:ObjectUpdater = new ObjectUpdater(target);
copy._paramUpdaters = { ...this._paramUpdaters };
copy._keys = [ ...this._keys ];
return copy;
}
toString():string {
let str:string = "";
for (const key of this._keys)
str += this._paramUpdaters[key].toString() + " ";
const bx = this._paramUpdaters["x"]?.bezier;
const by = this._paramUpdaters["y"]?.bezier;
if (bx && by) {
str += `bezier:`;
for (let i = 0; i < bx.length; i++) {
str += `(${bx[i]}, ${by[i]})`
}
str += ` `;
}
return str.trim();
}
complete() {
}
}