bard-legends-framework 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +192 -0
- package/.vscode/settings.json +4 -0
- package/coverage/clover.xml +539 -0
- package/coverage/coverage-final.json +12 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/game-entities/controller.ts.html +235 -0
- package/coverage/lcov-report/game-entities/entity-base.ts.html +202 -0
- package/coverage/lcov-report/game-entities/entity.ts.html +526 -0
- package/coverage/lcov-report/game-entities/index.html +191 -0
- package/coverage/lcov-report/game-entities/service.ts.html +379 -0
- package/coverage/lcov-report/game-entities/store.ts.html +391 -0
- package/coverage/lcov-report/game-entities/view.ts.html +154 -0
- package/coverage/lcov-report/helpers/animator/animator.ts.html +658 -0
- package/coverage/lcov-report/helpers/animator/index.html +116 -0
- package/coverage/lcov-report/helpers/auto-destroy/auto-destroy.ts.html +184 -0
- package/coverage/lcov-report/helpers/auto-destroy/index.html +116 -0
- package/coverage/lcov-report/helpers/index.html +116 -0
- package/coverage/lcov-report/helpers/update-loop.ts.html +127 -0
- package/coverage/lcov-report/helpers/view-array/index.html +116 -0
- package/coverage/lcov-report/helpers/view-array/view-array.ts.html +388 -0
- package/coverage/lcov-report/index.html +191 -0
- package/coverage/lcov-report/lib/vector/index.html +116 -0
- package/coverage/lcov-report/lib/vector/vector.ts.html +484 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +196 -0
- package/coverage/lcov.info +1056 -0
- package/dist/_interfaces/index.d.ts +7 -0
- package/dist/_interfaces/index.js +3 -0
- package/dist/_interfaces/index.js.map +1 -0
- package/dist/app.d.ts +21 -0
- package/dist/app.js +54 -0
- package/dist/app.js.map +1 -0
- package/dist/game-assets/container/container.d.ts +26 -0
- package/dist/game-assets/container/container.js +94 -0
- package/dist/game-assets/container/container.js.map +1 -0
- package/dist/game-assets/display-object/container.d.ts +59 -0
- package/dist/game-assets/display-object/container.js +219 -0
- package/dist/game-assets/display-object/container.js.map +1 -0
- package/dist/game-assets/display-object/container.spec.js.map +1 -0
- package/dist/game-assets/display-object/display-object.d.ts +56 -0
- package/dist/game-assets/display-object/display-object.js +214 -0
- package/dist/game-assets/display-object/display-object.js.map +1 -0
- package/dist/game-assets/display-object/display-object.spec.js.map +1 -0
- package/dist/game-assets/display-object/interfaces.d.ts +23 -0
- package/dist/game-assets/display-object/interfaces.js +3 -0
- package/dist/game-assets/display-object/interfaces.js.map +1 -0
- package/dist/game-assets/display-object/objects/container.d.ts +9 -0
- package/dist/game-assets/display-object/objects/container.js +41 -0
- package/dist/game-assets/display-object/objects/container.js.map +1 -0
- package/dist/game-assets/display-object/objects/graphics.d.ts +23 -0
- package/dist/game-assets/display-object/objects/graphics.js +117 -0
- package/dist/game-assets/display-object/objects/graphics.js.map +1 -0
- package/dist/game-assets/display-object/objects/image.d.ts +29 -0
- package/dist/game-assets/display-object/objects/image.js +130 -0
- package/dist/game-assets/display-object/objects/image.js.map +1 -0
- package/dist/game-assets/display-object/objects/sprite.d.ts +34 -0
- package/dist/game-assets/display-object/objects/sprite.js +87 -0
- package/dist/game-assets/display-object/objects/sprite.js.map +1 -0
- package/dist/game-assets/display-object/premade-display-objects/image-with-glowing-shapes.d.ts +19 -0
- package/dist/game-assets/display-object/premade-display-objects/image-with-glowing-shapes.js +94 -0
- package/dist/game-assets/display-object/premade-display-objects/image-with-glowing-shapes.js.map +1 -0
- package/dist/game-assets/filters/filters.d.ts +38 -0
- package/dist/game-assets/filters/filters.js +162 -0
- package/dist/game-assets/filters/filters.js.map +1 -0
- package/dist/game-assets/filters/glow-filter.d.ts +11 -0
- package/dist/game-assets/filters/glow-filter.js +33 -0
- package/dist/game-assets/filters/glow-filter.js.map +1 -0
- package/dist/game-assets/filters/shaders.d.ts +8 -0
- package/dist/game-assets/filters/shaders.js +82 -0
- package/dist/game-assets/filters/shaders.js.map +1 -0
- package/dist/game-assets/game-assets.d.ts +14 -0
- package/dist/game-assets/game-assets.js +92 -0
- package/dist/game-assets/game-assets.js.map +1 -0
- package/dist/game-assets/graphics/graphics.d.ts +26 -0
- package/dist/game-assets/graphics/graphics.js +104 -0
- package/dist/game-assets/graphics/graphics.js.map +1 -0
- package/dist/game-assets/helpers/glow.helper.d.ts +1 -0
- package/dist/game-assets/helpers/glow.helper.js +77 -0
- package/dist/game-assets/helpers/glow.helper.js.map +1 -0
- package/dist/game-assets/image/image-creator.d.ts +23 -0
- package/dist/game-assets/image/image-creator.js +96 -0
- package/dist/game-assets/image/image-creator.js.map +1 -0
- package/dist/game-assets/image/image.d.ts +34 -0
- package/dist/game-assets/image/image.js +139 -0
- package/dist/game-assets/image/image.js.map +1 -0
- package/dist/game-assets/image-data.helper.d.ts +16 -0
- package/dist/game-assets/image-data.helper.js +53 -0
- package/dist/game-assets/image-data.helper.js.map +1 -0
- package/dist/game-assets/index.d.ts +8 -0
- package/dist/game-assets/index.js +34 -0
- package/dist/game-assets/index.js.map +1 -0
- package/dist/game-assets/pixel-perfect-interaction.d.ts +2 -0
- package/dist/game-assets/pixel-perfect-interaction.js +111 -0
- package/dist/game-assets/pixel-perfect-interaction.js.map +1 -0
- package/dist/game-entities/attachable/attachable.d.ts +24 -0
- package/dist/game-entities/attachable/attachable.js +80 -0
- package/dist/game-entities/attachable/attachable.js.map +1 -0
- package/dist/game-entities/attachable/attachable.spec.js.map +1 -0
- package/dist/game-entities/controller/controller.d.ts +10 -0
- package/dist/game-entities/controller/controller.js +53 -0
- package/dist/game-entities/controller/controller.js.map +1 -0
- package/dist/game-entities/controller/controller.spec.js.map +1 -0
- package/dist/game-entities/controller.d.ts +10 -0
- package/dist/game-entities/controller.js +53 -0
- package/dist/game-entities/controller.js.map +1 -0
- package/dist/game-entities/entity/entity.d.ts +20 -0
- package/dist/game-entities/entity/entity.js +98 -0
- package/dist/game-entities/entity/entity.js.map +1 -0
- package/dist/game-entities/entity/entity.spec.js.map +1 -0
- package/dist/game-entities/entity/helpers/entity-store.helper.d.ts +15 -0
- package/dist/game-entities/entity/helpers/entity-store.helper.js +97 -0
- package/dist/game-entities/entity/helpers/entity-store.helper.js.map +1 -0
- package/dist/game-entities/entity/helpers/view-creation.helper.d.ts +11 -0
- package/dist/game-entities/entity/helpers/view-creation.helper.js +56 -0
- package/dist/game-entities/entity/helpers/view-creation.helper.js.map +1 -0
- package/dist/game-entities/entity-base/entity-base.d.ts +10 -0
- package/dist/game-entities/entity-base/entity-base.js +38 -0
- package/dist/game-entities/entity-base/entity-base.js.map +1 -0
- package/dist/game-entities/entity-base/entity-base.spec.js.map +1 -0
- package/dist/game-entities/entity-base.d.ts +12 -0
- package/dist/game-entities/entity-base.js +55 -0
- package/dist/game-entities/entity-base.js.map +1 -0
- package/dist/game-entities/entity.d.ts +22 -0
- package/dist/game-entities/entity.js +126 -0
- package/dist/game-entities/entity.js.map +1 -0
- package/dist/game-entities/index.d.ts +5 -0
- package/dist/game-entities/index.js +19 -0
- package/dist/game-entities/index.js.map +1 -0
- package/dist/game-entities/scene/scene.d.ts +17 -0
- package/dist/game-entities/scene/scene.js +100 -0
- package/dist/game-entities/scene/scene.js.map +1 -0
- package/dist/game-entities/scene/scene.spec.js.map +1 -0
- package/dist/game-entities/service/service.d.ts +9 -0
- package/dist/game-entities/service/service.js +62 -0
- package/dist/game-entities/service/service.js.map +1 -0
- package/dist/game-entities/service/service.spec.js.map +1 -0
- package/dist/game-entities/service.d.ts +10 -0
- package/dist/game-entities/service.js +93 -0
- package/dist/game-entities/service.js.map +1 -0
- package/dist/game-entities/store/store.d.ts +19 -0
- package/dist/game-entities/store/store.js +131 -0
- package/dist/game-entities/store/store.js.map +1 -0
- package/dist/game-entities/store/store.spec.js.map +1 -0
- package/dist/game-entities/store.d.ts +18 -0
- package/dist/game-entities/store.js +121 -0
- package/dist/game-entities/store.js.map +1 -0
- package/dist/game-entities/tests/controller.spec.js.map +1 -0
- package/dist/game-entities/tests/entity-base.spec.js.map +1 -0
- package/dist/game-entities/tests/entity.spec.js.map +1 -0
- package/dist/game-entities/tests/service.spec.js.map +1 -0
- package/dist/game-entities/tests/store.spec.js.map +1 -0
- package/dist/game-entities/tests/view.spec.js.map +1 -0
- package/dist/game-entities/view/view.d.ts +20 -0
- package/dist/game-entities/view/view.js +82 -0
- package/dist/game-entities/view/view.js.map +1 -0
- package/dist/game-entities/view/view.spec.js.map +1 -0
- package/dist/game-entities/view.d.ts +9 -0
- package/dist/game-entities/view.js +20 -0
- package/dist/game-entities/view.js.map +1 -0
- package/dist/helpers/animator/animator.d.ts +35 -0
- package/dist/helpers/animator/animator.js +158 -0
- package/dist/helpers/animator/animator.js.map +1 -0
- package/dist/helpers/animator/animator.spec.js.map +1 -0
- package/dist/helpers/auto-destroy/auto-destroy.d.ts +5 -0
- package/dist/helpers/auto-destroy/auto-destroy.js +38 -0
- package/dist/helpers/auto-destroy/auto-destroy.js.map +1 -0
- package/dist/helpers/auto-destroy/auto-destroy.spec.js.map +1 -0
- package/dist/helpers/update-loop.d.ts +7 -0
- package/dist/helpers/update-loop.js +16 -0
- package/dist/helpers/update-loop.js.map +1 -0
- package/dist/helpers/vertice/vertice.helper.d.ts +4 -0
- package/dist/helpers/vertice/vertice.helper.js +23 -0
- package/dist/helpers/vertice/vertice.helper.js.map +1 -0
- package/dist/helpers/view-array/view-array.d.ts +28 -0
- package/dist/helpers/view-array/view-array.js +117 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/animator/animations.d.ts +25 -0
- package/dist/lib/animator/animations.js +58 -0
- package/dist/lib/animator/animations.js.map +1 -0
- package/dist/lib/animator/animator.d.ts +52 -0
- package/dist/lib/animator/animator.js +220 -0
- package/dist/lib/animator/animator.js.map +1 -0
- package/dist/lib/animator/animator.spec.js.map +1 -0
- package/dist/lib/animator/index.d.ts +2 -0
- package/dist/lib/animator/index.js +19 -0
- package/dist/lib/animator/index.js.map +1 -0
- package/dist/lib/common/common-lib.d.ts +6 -0
- package/dist/lib/common/common-lib.js +40 -0
- package/dist/lib/common/common-lib.js.map +1 -0
- package/dist/lib/path-finder/path-finder.d.ts +5 -0
- package/dist/lib/path-finder/path-finder.js +24 -0
- package/dist/lib/path-finder/path-finder.js.map +1 -0
- package/dist/lib/update-loop.d.ts +13 -0
- package/dist/lib/update-loop.js +34 -0
- package/dist/lib/update-loop.js.map +1 -0
- package/dist/lib/vector/vector-coordinate-convertion.spec.js.map +1 -0
- package/dist/lib/vector/vector-radian.spec.js.map +1 -0
- package/dist/lib/vector/vector.d.ts +28 -0
- package/dist/lib/vector/vector.js +114 -0
- package/dist/lib/vector/vector.js.map +1 -0
- package/dist/lib/vector/vector.spec.js.map +1 -0
- package/dist/services/keyboard/keyboard.d.ts +7 -0
- package/dist/services/keyboard/keyboard.js +36 -0
- package/dist/services/keyboard/keyboard.js.map +1 -0
- package/dist/services/mouse/mouse.d.ts +12 -0
- package/dist/services/mouse/mouse.js +57 -0
- package/dist/services/mouse/mouse.js.map +1 -0
- package/dist/services/mouse/mouse.service.d.ts +12 -0
- package/dist/services/mouse/mouse.service.js +56 -0
- package/dist/services/mouse/mouse.service.js.map +1 -0
- package/dist/services/mouse/mouser-target-focus.service.d.ts +16 -0
- package/dist/services/mouse/mouser-target-focus.service.js +89 -0
- package/dist/services/mouse/mouser-target-focus.service.js.map +1 -0
- package/dist/services/sound/sound.d.ts +3 -0
- package/dist/services/sound/sound.js +22 -0
- package/dist/services/sound/sound.js.map +1 -0
- package/package.json +71 -0
- package/tsconfig.json +24 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VerticeHelper = void 0;
|
|
4
|
+
class VerticeHelper {
|
|
5
|
+
static convertShapePathsToVertices(shapePaths) {
|
|
6
|
+
return shapePaths.map(vertices => vertices
|
|
7
|
+
.reduce((acc, value, index) => {
|
|
8
|
+
if (index % 2 === 0) {
|
|
9
|
+
acc.push([value]);
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
acc[acc.length - 1].push(value);
|
|
13
|
+
}
|
|
14
|
+
return acc;
|
|
15
|
+
}, [])
|
|
16
|
+
.map(tuple => ({
|
|
17
|
+
x: tuple[0],
|
|
18
|
+
y: tuple[1]
|
|
19
|
+
})));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.VerticeHelper = VerticeHelper;
|
|
23
|
+
//# sourceMappingURL=vertice.helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vertice.helper.js","sourceRoot":"","sources":["../../../src/helpers/vertice/vertice.helper.ts"],"names":[],"mappings":";;;AAEA,MAAa,aAAa;IACxB,MAAM,CAAC,2BAA2B,CAAC,UAAgD;QACjF,OAAO,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAC/B,QAAQ;aACL,MAAM,CAAC,CAAC,GAAe,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACxC,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpB,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAC;aACL,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACb,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YACX,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;SACZ,CAAC,CAAC,CACN,CAAC;IACJ,CAAC;CACF;AAlBD,sCAkBC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { EntityBase } from '../../game-entities/entity-base';
|
|
2
|
+
import { Destroyable } from '../../_interfaces';
|
|
3
|
+
export declare class ViewArrayBase<ItemType, DefinitionType> {
|
|
4
|
+
private createFunction;
|
|
5
|
+
private updateFunction;
|
|
6
|
+
private destroyFunction;
|
|
7
|
+
items: {
|
|
8
|
+
item: ItemType;
|
|
9
|
+
definition: DefinitionType;
|
|
10
|
+
}[];
|
|
11
|
+
protected destroyed: boolean;
|
|
12
|
+
protected trackByPath: string;
|
|
13
|
+
private attachIsCalled;
|
|
14
|
+
constructor(createFunction: (definition: DefinitionType, index: number) => ItemType, updateFunction: (item: ItemType, definition: DefinitionType, index: number) => void, destroyFunction: (item: ItemType, definition: DefinitionType, index: number) => void);
|
|
15
|
+
set(definitions: DefinitionType[] | ReadonlyArray<DefinitionType>): void;
|
|
16
|
+
trackBy(path: string): ViewArrayBase<ItemType, DefinitionType>;
|
|
17
|
+
attach(parent: EntityBase): ViewArrayBase<ItemType, DefinitionType>;
|
|
18
|
+
destroy(): void;
|
|
19
|
+
}
|
|
20
|
+
export declare class ViewArray<DefinitionType> extends ViewArrayBase<Destroyable, DefinitionType> {
|
|
21
|
+
private controllerClassName;
|
|
22
|
+
constructor(ControllerClass: new (definition: DefinitionType, index: number, ...args: any[]) => ViewArrayController<DefinitionType>, ...args: any[]);
|
|
23
|
+
set(definitions: DefinitionType[] | ReadonlyArray<DefinitionType>): void;
|
|
24
|
+
}
|
|
25
|
+
export declare abstract class ViewArrayController<DefinitionType> implements Destroyable {
|
|
26
|
+
abstract update(definition: DefinitionType, index: number): void;
|
|
27
|
+
abstract destroy(definition: DefinitionType, index: number): void;
|
|
28
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __extends = (this && this.__extends) || (function () {
|
|
3
|
+
var extendStatics = function (d, b) {
|
|
4
|
+
extendStatics = Object.setPrototypeOf ||
|
|
5
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
+
return extendStatics(d, b);
|
|
8
|
+
};
|
|
9
|
+
return function (d, b) {
|
|
10
|
+
if (typeof b !== "function" && b !== null)
|
|
11
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
+
extendStatics(d, b);
|
|
13
|
+
function __() { this.constructor = d; }
|
|
14
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
+
};
|
|
16
|
+
})();
|
|
17
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
18
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
19
|
+
if (ar || !(i in from)) {
|
|
20
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
21
|
+
ar[i] = from[i];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
25
|
+
};
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.ViewArrayController = exports.ViewArray = exports.ViewArrayBase = void 0;
|
|
28
|
+
var helpers_lib_1 = require("helpers-lib");
|
|
29
|
+
var ViewArrayBase = /** @class */ (function () {
|
|
30
|
+
function ViewArrayBase(createFunction, updateFunction, destroyFunction) {
|
|
31
|
+
var _this = this;
|
|
32
|
+
this.createFunction = createFunction;
|
|
33
|
+
this.updateFunction = updateFunction;
|
|
34
|
+
this.destroyFunction = destroyFunction;
|
|
35
|
+
this.items = [];
|
|
36
|
+
this.destroyed = false;
|
|
37
|
+
this.trackByPath = '';
|
|
38
|
+
this.attachIsCalled = false;
|
|
39
|
+
setTimeout(function () {
|
|
40
|
+
if (!_this.attachIsCalled) {
|
|
41
|
+
throw new Error("EntityDecorator: entity is not attached to anything! Name: '".concat(_this.constructor.name, "'"));
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
ViewArrayBase.prototype.set = function (definitions) {
|
|
46
|
+
var _this = this;
|
|
47
|
+
if (this.destroyed) {
|
|
48
|
+
throw new Error("ViewArrayBase: set operation attempt after destruction!");
|
|
49
|
+
}
|
|
50
|
+
definitions.forEach(function (definition, index) {
|
|
51
|
+
if (_this.items[index] &&
|
|
52
|
+
helpers_lib_1.JsonHelper.deepFind(_this.items[index].definition, _this.trackByPath) === helpers_lib_1.JsonHelper.deepFind(definition, _this.trackByPath)) {
|
|
53
|
+
_this.updateFunction(_this.items[index].item, definition, index);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
var item = _this.createFunction(definition, index);
|
|
57
|
+
_this.items[index] && _this.destroyFunction(_this.items[index].item, _this.items[index].definition, index);
|
|
58
|
+
_this.items[index] = { definition: definition, item: item };
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
while (this.items.length > definitions.length) {
|
|
62
|
+
var element = this.items.pop();
|
|
63
|
+
var index = this.items.length;
|
|
64
|
+
element && this.destroyFunction(element.item, element.definition, index);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
ViewArrayBase.prototype.trackBy = function (path) {
|
|
68
|
+
this.trackByPath = path;
|
|
69
|
+
return this;
|
|
70
|
+
};
|
|
71
|
+
ViewArrayBase.prototype.attach = function (parent) {
|
|
72
|
+
// @ts-ignore
|
|
73
|
+
parent.setAttachment(this);
|
|
74
|
+
this.attachIsCalled = true;
|
|
75
|
+
return this;
|
|
76
|
+
};
|
|
77
|
+
ViewArrayBase.prototype.destroy = function () {
|
|
78
|
+
this.set([]);
|
|
79
|
+
this.destroyed = true;
|
|
80
|
+
};
|
|
81
|
+
return ViewArrayBase;
|
|
82
|
+
}());
|
|
83
|
+
exports.ViewArrayBase = ViewArrayBase;
|
|
84
|
+
var ViewArray = /** @class */ (function (_super) {
|
|
85
|
+
__extends(ViewArray, _super);
|
|
86
|
+
function ViewArray(ControllerClass) {
|
|
87
|
+
var args = [];
|
|
88
|
+
for (var _i = 1; _i < arguments.length; _i++) {
|
|
89
|
+
args[_i - 1] = arguments[_i];
|
|
90
|
+
}
|
|
91
|
+
var _this = this;
|
|
92
|
+
var createF = function (definition, index) { return new (ControllerClass.bind.apply(ControllerClass, __spreadArray([void 0, definition, index], args, false)))(); };
|
|
93
|
+
var updateF = function (item, definition, index) {
|
|
94
|
+
item.update(definition, index);
|
|
95
|
+
};
|
|
96
|
+
var destroyF = function (item, definition, index) {
|
|
97
|
+
item.destroy(definition, index);
|
|
98
|
+
};
|
|
99
|
+
_this = _super.call(this, createF, updateF, destroyF) || this;
|
|
100
|
+
_this.controllerClassName = ControllerClass.name;
|
|
101
|
+
return _this;
|
|
102
|
+
}
|
|
103
|
+
ViewArray.prototype.set = function (definitions) {
|
|
104
|
+
if (this.destroyed) {
|
|
105
|
+
throw new Error("ViewArray: set operation attempt after destruction! controller: '".concat(this.controllerClassName, "'"));
|
|
106
|
+
}
|
|
107
|
+
_super.prototype.set.call(this, definitions);
|
|
108
|
+
};
|
|
109
|
+
return ViewArray;
|
|
110
|
+
}(ViewArrayBase));
|
|
111
|
+
exports.ViewArray = ViewArray;
|
|
112
|
+
var ViewArrayController = /** @class */ (function () {
|
|
113
|
+
function ViewArrayController() {
|
|
114
|
+
}
|
|
115
|
+
return ViewArrayController;
|
|
116
|
+
}());
|
|
117
|
+
exports.ViewArrayController = ViewArrayController;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { UpdateCycle } from './lib/update-loop';
|
|
2
|
+
export { CanBeAttached } from './game-entities/attachable/attachable';
|
|
3
|
+
export { KeyboardService } from './services/keyboard/keyboard';
|
|
4
|
+
export { MouseService } from './services/mouse/mouse.service';
|
|
5
|
+
export { MouseTargetFocusService } from './services/mouse/mouser-target-focus.service';
|
|
6
|
+
export { PathFinder } from './lib/path-finder/path-finder';
|
|
7
|
+
export * from './_interfaces';
|
|
8
|
+
export * from './game-entities';
|
|
9
|
+
export * from './lib/animator';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.PathFinder = exports.MouseTargetFocusService = exports.MouseService = exports.KeyboardService = exports.UpdateCycle = void 0;
|
|
18
|
+
var update_loop_1 = require("./lib/update-loop");
|
|
19
|
+
Object.defineProperty(exports, "UpdateCycle", { enumerable: true, get: function () { return update_loop_1.UpdateCycle; } });
|
|
20
|
+
var keyboard_1 = require("./services/keyboard/keyboard");
|
|
21
|
+
Object.defineProperty(exports, "KeyboardService", { enumerable: true, get: function () { return keyboard_1.KeyboardService; } });
|
|
22
|
+
var mouse_service_1 = require("./services/mouse/mouse.service");
|
|
23
|
+
Object.defineProperty(exports, "MouseService", { enumerable: true, get: function () { return mouse_service_1.MouseService; } });
|
|
24
|
+
var mouser_target_focus_service_1 = require("./services/mouse/mouser-target-focus.service");
|
|
25
|
+
Object.defineProperty(exports, "MouseTargetFocusService", { enumerable: true, get: function () { return mouser_target_focus_service_1.MouseTargetFocusService; } });
|
|
26
|
+
var path_finder_1 = require("./lib/path-finder/path-finder");
|
|
27
|
+
Object.defineProperty(exports, "PathFinder", { enumerable: true, get: function () { return path_finder_1.PathFinder; } });
|
|
28
|
+
__exportStar(require("./_interfaces"), exports);
|
|
29
|
+
__exportStar(require("./game-entities"), exports);
|
|
30
|
+
__exportStar(require("./lib/animator"), exports);
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,iDAAgD;AAAvC,0GAAA,WAAW,OAAA;AAEpB,yDAA+D;AAAtD,2GAAA,eAAe,OAAA;AACxB,gEAA8D;AAArD,6GAAA,YAAY,OAAA;AACrB,4FAAuF;AAA9E,sIAAA,uBAAuB,OAAA;AAChC,6DAA2D;AAAlD,yGAAA,UAAU,OAAA;AACnB,gDAA8B;AAC9B,kDAAgC;AAChC,iDAA+B"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface AnimatorAnimation {
|
|
2
|
+
start(): void;
|
|
3
|
+
multiplierFunction(t: number): number;
|
|
4
|
+
}
|
|
5
|
+
export declare class AnimationLineer implements AnimatorAnimation {
|
|
6
|
+
start(): void;
|
|
7
|
+
multiplierFunction(t: number): number;
|
|
8
|
+
}
|
|
9
|
+
export declare class AnimationEaseInOut implements AnimatorAnimation {
|
|
10
|
+
start(): void;
|
|
11
|
+
multiplierFunction(t: number): number;
|
|
12
|
+
}
|
|
13
|
+
export declare class AnimationEaseIn implements AnimatorAnimation {
|
|
14
|
+
start(): void;
|
|
15
|
+
multiplierFunction(t: number): number;
|
|
16
|
+
}
|
|
17
|
+
export declare class AnimationEaseOut implements AnimatorAnimation {
|
|
18
|
+
start(): void;
|
|
19
|
+
multiplierFunction(t: number): number;
|
|
20
|
+
}
|
|
21
|
+
export declare class AnimationFlicker implements AnimatorAnimation {
|
|
22
|
+
private timeGrid;
|
|
23
|
+
start(): void;
|
|
24
|
+
multiplierFunction(t: number): number;
|
|
25
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AnimationFlicker = exports.AnimationEaseOut = exports.AnimationEaseIn = exports.AnimationEaseInOut = exports.AnimationLineer = void 0;
|
|
4
|
+
const helpers_lib_1 = require("helpers-lib");
|
|
5
|
+
class AnimationLineer {
|
|
6
|
+
start() { }
|
|
7
|
+
multiplierFunction(t) {
|
|
8
|
+
return t;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
exports.AnimationLineer = AnimationLineer;
|
|
12
|
+
class AnimationEaseInOut {
|
|
13
|
+
start() { }
|
|
14
|
+
multiplierFunction(t) {
|
|
15
|
+
if ((t *= 2) < 1) {
|
|
16
|
+
return 0.5 * t * t;
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
return -0.5 * (--t * (t - 2) - 1);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.AnimationEaseInOut = AnimationEaseInOut;
|
|
24
|
+
class AnimationEaseIn {
|
|
25
|
+
start() { }
|
|
26
|
+
multiplierFunction(t) {
|
|
27
|
+
return Math.pow(t, 2);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.AnimationEaseIn = AnimationEaseIn;
|
|
31
|
+
class AnimationEaseOut {
|
|
32
|
+
start() { }
|
|
33
|
+
multiplierFunction(t) {
|
|
34
|
+
return 1 - Math.pow(1 - t, 2);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.AnimationEaseOut = AnimationEaseOut;
|
|
38
|
+
class AnimationFlicker {
|
|
39
|
+
start() {
|
|
40
|
+
this.timeGrid = new Array(10).fill(0);
|
|
41
|
+
helpers_lib_1.Random.randomIntegerBetween(0, 9);
|
|
42
|
+
this.timeGrid[helpers_lib_1.Random.randomIntegerBetween(0, 9)] = Math.random();
|
|
43
|
+
if (Math.random() < 0.3) {
|
|
44
|
+
helpers_lib_1.Random.randomIntegerBetween(0, 9);
|
|
45
|
+
this.timeGrid[helpers_lib_1.Random.randomIntegerBetween(0, 9)] = Math.random();
|
|
46
|
+
}
|
|
47
|
+
if (Math.random() < 0.2) {
|
|
48
|
+
helpers_lib_1.Random.randomIntegerBetween(0, 9);
|
|
49
|
+
this.timeGrid[helpers_lib_1.Random.randomIntegerBetween(0, 9)] = Math.random();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
multiplierFunction(t) {
|
|
53
|
+
let index = Math.floor(t * 10);
|
|
54
|
+
return this.timeGrid[index];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.AnimationFlicker = AnimationFlicker;
|
|
58
|
+
//# sourceMappingURL=animations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animations.js","sourceRoot":"","sources":["../../../src/lib/animator/animations.ts"],"names":[],"mappings":";;;AAAA,6CAAqC;AAOrC,MAAa,eAAe;IAC1B,KAAK,KAAU,CAAC;IAChB,kBAAkB,CAAC,CAAS;QAC1B,OAAO,CAAC,CAAC;IACX,CAAC;CACF;AALD,0CAKC;AAED,MAAa,kBAAkB;IAC7B,KAAK,KAAU,CAAC;IAChB,kBAAkB,CAAC,CAAS;QAC1B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YACjB,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;CACF;AATD,gDASC;AAED,MAAa,eAAe;IAC1B,KAAK,KAAU,CAAC;IAChB,kBAAkB,CAAC,CAAS;QAC1B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxB,CAAC;CACF;AALD,0CAKC;AAED,MAAa,gBAAgB;IAC3B,KAAK,KAAU,CAAC;IAChB,kBAAkB,CAAC,CAAS;QAC1B,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,CAAC;CACF;AALD,4CAKC;AAED,MAAa,gBAAgB;IAG3B,KAAK;QACH,IAAI,CAAC,QAAQ,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,oBAAM,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,oBAAM,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACjE,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC;YACxB,oBAAM,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAClC,IAAI,CAAC,QAAQ,CAAC,oBAAM,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACnE,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC;YACxB,oBAAM,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAClC,IAAI,CAAC,QAAQ,CAAC,oBAAM,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACnE,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,CAAS;QAC1B,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF;AArBD,4CAqBC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { AnimatorAnimation } from './animations';
|
|
2
|
+
export interface AnimationState {
|
|
3
|
+
duration: number;
|
|
4
|
+
elapsedTime: number;
|
|
5
|
+
startingValue: number;
|
|
6
|
+
targetValue: number;
|
|
7
|
+
loop: boolean;
|
|
8
|
+
completeAnimationsHandling: CompleteAnimationsHandlingType;
|
|
9
|
+
}
|
|
10
|
+
export declare enum ReAnimateHandlingType {
|
|
11
|
+
throwError = "throwError",
|
|
12
|
+
ignore = "ignore"
|
|
13
|
+
}
|
|
14
|
+
export declare enum CompleteAnimationsHandlingType {
|
|
15
|
+
returnToOriginal = "returnToOriginal",
|
|
16
|
+
stayInCurrentState = "stayInCurrentState",
|
|
17
|
+
jumpToEnd = "jumpToEnd"
|
|
18
|
+
}
|
|
19
|
+
export interface AnimationOptions<T> {
|
|
20
|
+
duration?: number;
|
|
21
|
+
animation?: AnimatorAnimation;
|
|
22
|
+
loop?: boolean;
|
|
23
|
+
reAnimateHandling?: ReAnimateHandlingType;
|
|
24
|
+
completeAnimationsHandling?: CompleteAnimationsHandlingType;
|
|
25
|
+
}
|
|
26
|
+
export declare class Animator<T> {
|
|
27
|
+
private static animatedObjects;
|
|
28
|
+
readonly targetObject: T;
|
|
29
|
+
private effectOn;
|
|
30
|
+
private defaultDuration;
|
|
31
|
+
private defaultAnimation;
|
|
32
|
+
private defaultLoop;
|
|
33
|
+
private defaultReAnimateHandling;
|
|
34
|
+
private defaultCompleteAnimationsHandling;
|
|
35
|
+
private onChangeCallback?;
|
|
36
|
+
private running;
|
|
37
|
+
private propertyStates;
|
|
38
|
+
private updateCycleSubscription;
|
|
39
|
+
constructor(target: T, effectOn: string | string[], options?: AnimationOptions<T>);
|
|
40
|
+
get isAnimating(): boolean;
|
|
41
|
+
getAnimationStateOfKey(key: string): AnimationState | undefined;
|
|
42
|
+
onChange(callback: (target: T) => void): Animator<T>;
|
|
43
|
+
pauseAnimations(): void;
|
|
44
|
+
resumeAnimations(): void;
|
|
45
|
+
completeAnimations(completeAnimationsHandling?: CompleteAnimationsHandlingType): void;
|
|
46
|
+
set(values: Record<string, any>): void;
|
|
47
|
+
animate(values: Record<string, any>, options?: AnimationOptions<T>): Promise<void>;
|
|
48
|
+
private startAnimate;
|
|
49
|
+
private update;
|
|
50
|
+
private subscribeUpdateCycle;
|
|
51
|
+
private checkPropertyValidity;
|
|
52
|
+
}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Animator = exports.CompleteAnimationsHandlingType = exports.ReAnimateHandlingType = void 0;
|
|
4
|
+
const helpers_lib_1 = require("helpers-lib");
|
|
5
|
+
const update_loop_1 = require("../update-loop");
|
|
6
|
+
const animations_1 = require("./animations");
|
|
7
|
+
var ReAnimateHandlingType;
|
|
8
|
+
(function (ReAnimateHandlingType) {
|
|
9
|
+
ReAnimateHandlingType["throwError"] = "throwError";
|
|
10
|
+
ReAnimateHandlingType["ignore"] = "ignore";
|
|
11
|
+
// TODO: blendIn
|
|
12
|
+
})(ReAnimateHandlingType || (exports.ReAnimateHandlingType = ReAnimateHandlingType = {}));
|
|
13
|
+
var CompleteAnimationsHandlingType;
|
|
14
|
+
(function (CompleteAnimationsHandlingType) {
|
|
15
|
+
CompleteAnimationsHandlingType["returnToOriginal"] = "returnToOriginal";
|
|
16
|
+
CompleteAnimationsHandlingType["stayInCurrentState"] = "stayInCurrentState";
|
|
17
|
+
CompleteAnimationsHandlingType["jumpToEnd"] = "jumpToEnd";
|
|
18
|
+
})(CompleteAnimationsHandlingType || (exports.CompleteAnimationsHandlingType = CompleteAnimationsHandlingType = {}));
|
|
19
|
+
const DEFAULT_DURATION = 200;
|
|
20
|
+
const DEFAULT_ANIMATION = new animations_1.AnimationLineer();
|
|
21
|
+
const DEFAULT_LOOP = false;
|
|
22
|
+
const DEFAULT_RE_ANIMATE_HANDLING = ReAnimateHandlingType.throwError;
|
|
23
|
+
const DEFAULT_COMPLETE_ANIMATIONS_HANDLING = CompleteAnimationsHandlingType.stayInCurrentState;
|
|
24
|
+
class Animator {
|
|
25
|
+
static { this.animatedObjects = new Set(); }
|
|
26
|
+
constructor(target, effectOn, options = {}) {
|
|
27
|
+
this.effectOn = new Set();
|
|
28
|
+
this.running = true;
|
|
29
|
+
this.propertyStates = new Map();
|
|
30
|
+
if (!helpers_lib_1.Comparator.isObject(target)) {
|
|
31
|
+
throw new Error(`Animator: target is not an object! Target: '${target}'`);
|
|
32
|
+
}
|
|
33
|
+
else if (Animator.animatedObjects.has(target)) {
|
|
34
|
+
throw new Error(`Animator: target is already animated! Target: '${target}'`);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
Animator.animatedObjects.add(target);
|
|
38
|
+
}
|
|
39
|
+
this.targetObject = target;
|
|
40
|
+
this.effectOn = helpers_lib_1.Comparator.isArray(effectOn) ? new Set(effectOn) : new Set([effectOn]);
|
|
41
|
+
this.defaultDuration = options.duration || DEFAULT_DURATION;
|
|
42
|
+
this.defaultAnimation = options.animation || DEFAULT_ANIMATION;
|
|
43
|
+
this.defaultLoop = options.loop || DEFAULT_LOOP;
|
|
44
|
+
this.defaultReAnimateHandling = options.reAnimateHandling || DEFAULT_RE_ANIMATE_HANDLING;
|
|
45
|
+
this.defaultCompleteAnimationsHandling = options.completeAnimationsHandling || DEFAULT_COMPLETE_ANIMATIONS_HANDLING;
|
|
46
|
+
this.effectOn.forEach(key => {
|
|
47
|
+
if (!helpers_lib_1.Comparator.hasProperty(target, key)) {
|
|
48
|
+
throw new Error(`Animator: target does not have target property. Target property: '${key}'`);
|
|
49
|
+
}
|
|
50
|
+
else if (!helpers_lib_1.Comparator.isNumber(target[key])) {
|
|
51
|
+
throw new Error(`Animator: target property is not a number. Target property: '${key}'`);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
get isAnimating() {
|
|
56
|
+
return this.propertyStates.size > 0;
|
|
57
|
+
}
|
|
58
|
+
getAnimationStateOfKey(key) {
|
|
59
|
+
let propertyState = this.propertyStates.get(key);
|
|
60
|
+
if (propertyState) {
|
|
61
|
+
return {
|
|
62
|
+
duration: propertyState.duration,
|
|
63
|
+
elapsedTime: propertyState.elapsedTime,
|
|
64
|
+
startingValue: propertyState.startingValue,
|
|
65
|
+
targetValue: propertyState.targetValue,
|
|
66
|
+
loop: propertyState.loop,
|
|
67
|
+
completeAnimationsHandling: propertyState.completeAnimationsHandling
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
onChange(callback) {
|
|
72
|
+
if (this.onChangeCallback) {
|
|
73
|
+
throw new Error('Animator: onChangeCallback is already set!');
|
|
74
|
+
}
|
|
75
|
+
this.onChangeCallback = callback;
|
|
76
|
+
return this;
|
|
77
|
+
}
|
|
78
|
+
pauseAnimations() {
|
|
79
|
+
this.running = false;
|
|
80
|
+
}
|
|
81
|
+
resumeAnimations() {
|
|
82
|
+
this.running = true;
|
|
83
|
+
}
|
|
84
|
+
completeAnimations(completeAnimationsHandling) {
|
|
85
|
+
let triggerOnChange = this.isAnimating;
|
|
86
|
+
this.propertyStates.forEach((value, key) => {
|
|
87
|
+
let completeAnimationsHandlingFinal = completeAnimationsHandling || value.completeAnimationsHandling;
|
|
88
|
+
if (completeAnimationsHandlingFinal === CompleteAnimationsHandlingType.returnToOriginal) {
|
|
89
|
+
this.targetObject[key] = value.startingValue;
|
|
90
|
+
}
|
|
91
|
+
else if (completeAnimationsHandlingFinal === CompleteAnimationsHandlingType.jumpToEnd) {
|
|
92
|
+
this.targetObject[key] = value.targetValue;
|
|
93
|
+
}
|
|
94
|
+
value.completionCallback();
|
|
95
|
+
this.propertyStates.delete(key);
|
|
96
|
+
});
|
|
97
|
+
triggerOnChange && this.onChangeCallback?.(this.targetObject);
|
|
98
|
+
}
|
|
99
|
+
set(values) {
|
|
100
|
+
Object.keys(values).forEach(key => {
|
|
101
|
+
this.checkPropertyValidity(key);
|
|
102
|
+
if (this.propertyStates.get(key)) {
|
|
103
|
+
throw new Error(`Animator: property is already being animated. Property: '${key}'`);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
let triggerOnChange = false;
|
|
107
|
+
Object.keys(values).forEach(key => {
|
|
108
|
+
triggerOnChange = triggerOnChange || this.targetObject[key] !== values[key];
|
|
109
|
+
this.targetObject[key] = values[key];
|
|
110
|
+
});
|
|
111
|
+
triggerOnChange && this.onChangeCallback?.(this.targetObject);
|
|
112
|
+
}
|
|
113
|
+
async animate(values, options = {}) {
|
|
114
|
+
let valueKeys = Object.keys(values);
|
|
115
|
+
valueKeys.forEach(key => {
|
|
116
|
+
this.checkPropertyValidity(key);
|
|
117
|
+
});
|
|
118
|
+
return this.startAnimate(values, options);
|
|
119
|
+
}
|
|
120
|
+
startAnimate(values, options = {}) {
|
|
121
|
+
let reAnimateHandling = options.reAnimateHandling || this.defaultReAnimateHandling;
|
|
122
|
+
Object.keys(values).forEach(key => {
|
|
123
|
+
let previousState = this.propertyStates.get(key);
|
|
124
|
+
if (previousState) {
|
|
125
|
+
if (reAnimateHandling === ReAnimateHandlingType.throwError) {
|
|
126
|
+
throw new Error(`Animator: property is already being animated. Property: '${key}'`);
|
|
127
|
+
}
|
|
128
|
+
else if (reAnimateHandling === ReAnimateHandlingType.ignore) {
|
|
129
|
+
delete values[key];
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
return new Promise(resolveAll => {
|
|
134
|
+
Promise.all(Object.keys(values).map(key => new Promise(resolve => {
|
|
135
|
+
let duration = options.duration || this.defaultDuration;
|
|
136
|
+
let animation = options.animation || this.defaultAnimation;
|
|
137
|
+
let loop = options.loop || this.defaultLoop;
|
|
138
|
+
let completeAnimationsHandling = options.completeAnimationsHandling || this.defaultCompleteAnimationsHandling;
|
|
139
|
+
animation.start();
|
|
140
|
+
try {
|
|
141
|
+
this.propertyStates.set(key, {
|
|
142
|
+
duration,
|
|
143
|
+
animation,
|
|
144
|
+
elapsedTime: 0,
|
|
145
|
+
startingValue: this.targetObject[key],
|
|
146
|
+
targetValue: values[key],
|
|
147
|
+
loop,
|
|
148
|
+
completeAnimationsHandling,
|
|
149
|
+
completionCallback: () => {
|
|
150
|
+
resolve(undefined);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
catch (e) {
|
|
155
|
+
resolveAll();
|
|
156
|
+
}
|
|
157
|
+
}))).then(() => {
|
|
158
|
+
resolveAll();
|
|
159
|
+
});
|
|
160
|
+
this.subscribeUpdateCycle();
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
update(delta) {
|
|
164
|
+
if (this.running) {
|
|
165
|
+
let triggerOnChange = this.propertyStates.size;
|
|
166
|
+
this.propertyStates.forEach((value, key) => {
|
|
167
|
+
value.elapsedTime += delta;
|
|
168
|
+
let animationIsCompete = value.elapsedTime >= value.duration;
|
|
169
|
+
if (animationIsCompete) {
|
|
170
|
+
if (value.loop) {
|
|
171
|
+
value.animation.start();
|
|
172
|
+
value.elapsedTime -= value.duration;
|
|
173
|
+
animationIsCompete = false;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
if (value.completeAnimationsHandling === CompleteAnimationsHandlingType.returnToOriginal) {
|
|
177
|
+
this.targetObject[key] = value.startingValue;
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
this.targetObject[key] = value.targetValue;
|
|
181
|
+
}
|
|
182
|
+
value.completionCallback();
|
|
183
|
+
this.propertyStates.delete(key);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (!animationIsCompete) {
|
|
187
|
+
let multiplier = value.animation.multiplierFunction(value.elapsedTime / value.duration);
|
|
188
|
+
let relativeTarget = value.targetValue - value.startingValue;
|
|
189
|
+
this.targetObject[key] = relativeTarget * multiplier + value.startingValue;
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
triggerOnChange && this.onChangeCallback?.(this.targetObject);
|
|
193
|
+
if (this.propertyStates.size <= 0) {
|
|
194
|
+
this.updateCycleSubscription?.unsubscribe();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
subscribeUpdateCycle() {
|
|
199
|
+
this.updateCycleSubscription?.unsubscribe();
|
|
200
|
+
this.updateCycleSubscription = update_loop_1.UpdateCycle.updateAction.subscribe(update => {
|
|
201
|
+
try {
|
|
202
|
+
this.update(update.delta);
|
|
203
|
+
}
|
|
204
|
+
catch (e) {
|
|
205
|
+
this.propertyStates.forEach(value => {
|
|
206
|
+
value.completionCallback();
|
|
207
|
+
});
|
|
208
|
+
this.propertyStates = new Map();
|
|
209
|
+
this.updateCycleSubscription?.unsubscribe();
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
checkPropertyValidity(key) {
|
|
214
|
+
if (!this.effectOn.has(key)) {
|
|
215
|
+
throw new Error(`Animator: not effected property is tried to update. Key: '${key}', EffectOn: '${this.effectOn}'`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
exports.Animator = Animator;
|
|
220
|
+
//# sourceMappingURL=animator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animator.js","sourceRoot":"","sources":["../../../src/lib/animator/animator.ts"],"names":[],"mappings":"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"}
|