1230 lines
41 KiB
JavaScript
1230 lines
41 KiB
JavaScript
var __extends = (this && this.__extends) || (function () {
|
|
var extendStatics = Object.setPrototypeOf ||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
|
return function (d, b) {
|
|
extendStatics(d, b);
|
|
function __() { this.constructor = d; }
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
};
|
|
})();
|
|
Array.prototype.findIndex = function (predicate) {
|
|
function findIndex(array, predicate) {
|
|
for (var i = 0, len = array.length; i < len; i++) {
|
|
if (predicate.call(arguments[2], array[i], i, array)) {
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
return findIndex(this, predicate);
|
|
};
|
|
Array.prototype.any = function (predicate) {
|
|
function any(array, predicate) {
|
|
return array.findIndex(predicate) > -1;
|
|
}
|
|
return any(this, predicate);
|
|
};
|
|
Array.prototype.firstOrDefault = function (predicate) {
|
|
function firstOrDefault(array, predicate) {
|
|
var index = array.findIndex(predicate);
|
|
return index == -1 ? null : array[index];
|
|
}
|
|
return firstOrDefault(this, predicate);
|
|
};
|
|
Array.prototype.find = function (predicate) {
|
|
function find(array, predicate) {
|
|
return array.firstOrDefault(predicate);
|
|
}
|
|
return find(this, predicate);
|
|
};
|
|
Array.prototype.where = function (predicate) {
|
|
function where(array, predicate) {
|
|
if (typeof (array.reduce) === "function") {
|
|
return array.reduce(function (ret, element, index) {
|
|
if (predicate.call(arguments[2], element, index, array)) {
|
|
ret.push(element);
|
|
}
|
|
return ret;
|
|
}, []);
|
|
}
|
|
else {
|
|
var ret = [];
|
|
for (var i = 0, len = array.length; i < len; i++) {
|
|
var element = array[i];
|
|
if (predicate.call(arguments[2], element, i, array)) {
|
|
ret.push(element);
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
}
|
|
return where(this, predicate);
|
|
};
|
|
Array.prototype.count = function (predicate) {
|
|
function count(array, predicate) {
|
|
return array.where(predicate).length;
|
|
}
|
|
return count(this, predicate);
|
|
};
|
|
Array.prototype.findAll = function (predicate) {
|
|
function findAll(array, predicate) {
|
|
return array.where(predicate);
|
|
}
|
|
return findAll(this, predicate);
|
|
};
|
|
Array.prototype.contains = function (value) {
|
|
function contains(array, value) {
|
|
for (var i = 0, len = array.length; i < len; i++) {
|
|
if (array[i] == value) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
return contains(this, value);
|
|
};
|
|
Array.prototype.removeAll = function (predicate) {
|
|
function removeAll(array, predicate) {
|
|
var index;
|
|
do {
|
|
index = array.findIndex(predicate);
|
|
if (index >= 0) {
|
|
array.splice(index, 1);
|
|
}
|
|
} while (index >= 0);
|
|
}
|
|
removeAll(this, predicate);
|
|
};
|
|
Array.prototype.remove = function (element) {
|
|
function remove(array, element) {
|
|
var index = array.findIndex(function (x) {
|
|
return x === element;
|
|
});
|
|
if (index >= 0) {
|
|
array.splice(index, 1);
|
|
return true;
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
}
|
|
return remove(this, element);
|
|
};
|
|
Array.prototype.removeAt = function (index) {
|
|
function removeAt(array, index) {
|
|
array.splice(index, 1);
|
|
}
|
|
return removeAt(this, index);
|
|
};
|
|
Array.prototype.removeRange = function (index, count) {
|
|
function removeRange(array, index, count) {
|
|
array.splice(index, count);
|
|
}
|
|
return removeRange(this, index, count);
|
|
};
|
|
Array.prototype.select = function (selector) {
|
|
function select(array, selector) {
|
|
if (typeof (array.reduce) === "function") {
|
|
return array.reduce(function (ret, element, index) {
|
|
ret.push(selector.call(arguments[2], element, index, array));
|
|
return ret;
|
|
}, []);
|
|
}
|
|
else {
|
|
var ret = [];
|
|
for (var i = 0, len = array.length; i < len; i++) {
|
|
ret.push(selector.call(arguments[2], array[i], i, array));
|
|
}
|
|
return ret;
|
|
}
|
|
}
|
|
return select(this, selector);
|
|
};
|
|
Array.prototype.orderBy = function (keySelector, comparer) {
|
|
function orderBy(array, keySelector, comparer) {
|
|
array.sort(function (x, y) {
|
|
var v1 = keySelector(x);
|
|
var v2 = keySelector(y);
|
|
if (comparer) {
|
|
return comparer(v1, v2);
|
|
}
|
|
else {
|
|
return (v1 > v2) ? 1 : -1;
|
|
}
|
|
});
|
|
return array;
|
|
}
|
|
return orderBy(this, keySelector, comparer);
|
|
};
|
|
Array.prototype.orderByDescending = function (keySelector, comparer) {
|
|
function orderByDescending(array, keySelector, comparer) {
|
|
array.sort(function (x, y) {
|
|
var v1 = keySelector(x);
|
|
var v2 = keySelector(y);
|
|
if (comparer) {
|
|
return -comparer(v1, v2);
|
|
}
|
|
else {
|
|
return (v1 < v2) ? 1 : -1;
|
|
}
|
|
});
|
|
return array;
|
|
}
|
|
return orderByDescending(this, keySelector, comparer);
|
|
};
|
|
Array.prototype.groupBy = function (keySelector) {
|
|
function groupBy(array, keySelector) {
|
|
if (typeof (array.reduce) === "function") {
|
|
var keys_1 = [];
|
|
return array.reduce(function (groups, element, index) {
|
|
var key = JSON.stringify(keySelector.call(arguments[1], element, index, array));
|
|
var index2 = keys_1.findIndex(function (x) { return x === key; });
|
|
if (index2 < 0) {
|
|
index2 = keys_1.push(key) - 1;
|
|
}
|
|
if (!groups[index2]) {
|
|
groups[index2] = [];
|
|
}
|
|
groups[index2].push(element);
|
|
return groups;
|
|
}, []);
|
|
}
|
|
else {
|
|
var groups = [];
|
|
var keys = [];
|
|
var _loop_1 = function (i, len) {
|
|
var key = JSON.stringify(keySelector.call(arguments_1[1], array[i], i, array));
|
|
var index = keys.findIndex(function (x) { return x === key; });
|
|
if (index < 0) {
|
|
index = keys.push(key) - 1;
|
|
}
|
|
if (!groups[index]) {
|
|
groups[index] = [];
|
|
}
|
|
groups[index].push(array[i]);
|
|
};
|
|
var arguments_1 = arguments;
|
|
for (var i = 0, len = array.length; i < len; i++) {
|
|
_loop_1(i, len);
|
|
}
|
|
return groups;
|
|
}
|
|
}
|
|
return groupBy(this, keySelector);
|
|
};
|
|
Array.prototype.sum = function (selector) {
|
|
function sum(array, selector) {
|
|
var ret;
|
|
for (var i = 0, len = array.length; i < len; i++) {
|
|
if (i == 0) {
|
|
if (selector) {
|
|
ret = selector.call(arguments[2], array[i], i, array);
|
|
}
|
|
else {
|
|
ret = array[i];
|
|
}
|
|
}
|
|
else {
|
|
if (selector) {
|
|
ret += selector.call(arguments[2], array[i], i, array);
|
|
}
|
|
else {
|
|
ret += array[i];
|
|
}
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
return sum(this, selector);
|
|
};
|
|
var Component = (function () {
|
|
function Component() {
|
|
this._enabled = true;
|
|
}
|
|
Object.defineProperty(Component.prototype, "enabled", {
|
|
get: function () {
|
|
return this.entity ? this.entity.enabled && this._enabled : this._enabled;
|
|
},
|
|
set: function (value) {
|
|
this.setEnabled(value);
|
|
},
|
|
enumerable: true,
|
|
configurable: true
|
|
});
|
|
Component.prototype.setEnabled = function (isEnabled) {
|
|
if (this._enabled != isEnabled) {
|
|
this._enabled = isEnabled;
|
|
}
|
|
return this;
|
|
};
|
|
Component.prototype.update = function () {
|
|
};
|
|
Component.prototype.bind = function (displayRender) {
|
|
this.displayRender = displayRender;
|
|
return this;
|
|
};
|
|
Component.prototype.registerComponent = function () {
|
|
this.entity.componentBits.set(ComponentTypeManager.getIndexFor(this), false);
|
|
this.entity.scene.entityProcessors.onComponentAdded(this.entity);
|
|
};
|
|
Component.prototype.deregisterComponent = function () {
|
|
this.entity.componentBits.set(ComponentTypeManager.getIndexFor(this));
|
|
this.entity.scene.entityProcessors.onComponentRemoved(this.entity);
|
|
};
|
|
return Component;
|
|
}());
|
|
var Entity = (function () {
|
|
function Entity(name) {
|
|
this._updateOrder = 0;
|
|
this._enabled = true;
|
|
this.name = name;
|
|
this.transform = new Transform(this);
|
|
this.components = [];
|
|
this.componentBits = new BitSet();
|
|
}
|
|
Object.defineProperty(Entity.prototype, "enabled", {
|
|
get: function () {
|
|
return this._enabled;
|
|
},
|
|
set: function (value) {
|
|
this.setEnabled(value);
|
|
},
|
|
enumerable: true,
|
|
configurable: true
|
|
});
|
|
Entity.prototype.setEnabled = function (isEnabled) {
|
|
if (this._enabled != isEnabled) {
|
|
this._enabled = isEnabled;
|
|
}
|
|
return this;
|
|
};
|
|
Object.defineProperty(Entity.prototype, "updateOrder", {
|
|
get: function () {
|
|
return this._updateOrder;
|
|
},
|
|
set: function (value) {
|
|
this.setUpdateOrder(value);
|
|
},
|
|
enumerable: true,
|
|
configurable: true
|
|
});
|
|
Entity.prototype.setUpdateOrder = function (updateOrder) {
|
|
if (this._updateOrder != updateOrder) {
|
|
this._updateOrder = updateOrder;
|
|
if (this.scene) {
|
|
}
|
|
return this;
|
|
}
|
|
};
|
|
Entity.prototype.attachToScene = function (newScene) {
|
|
this.scene = newScene;
|
|
newScene.entities.add(this);
|
|
this.components.forEach(function (component) { return component.registerComponent(); });
|
|
for (var i = 0; i < this.transform.childCount; i++) {
|
|
this.transform.getChild(i).entity.attachToScene(newScene);
|
|
}
|
|
};
|
|
Entity.prototype.addComponent = function (component) {
|
|
component.entity = this;
|
|
this.components.push(component);
|
|
component.initialize();
|
|
return component;
|
|
};
|
|
Entity.prototype.getComponent = function (type) {
|
|
return this.components.firstOrDefault(function (component) { return component instanceof type; });
|
|
};
|
|
Entity.prototype.update = function () {
|
|
this.components.forEach(function (component) { return component.update(); });
|
|
this.transform.updateTransform();
|
|
};
|
|
Entity.prototype.destory = function () {
|
|
this.scene.entities.remove(this);
|
|
this.transform.parent = null;
|
|
for (var i = this.transform.childCount - 1; i >= 0; i--) {
|
|
var child = this.transform.getChild(i);
|
|
child.entity.destory();
|
|
}
|
|
};
|
|
return Entity;
|
|
}());
|
|
var Scene = (function (_super) {
|
|
__extends(Scene, _super);
|
|
function Scene(displayObject) {
|
|
var _this = _super.call(this) || this;
|
|
displayObject.stage.addChild(_this);
|
|
_this._projectionMatrix = new Matrix2D(0, 0, 0, 0, 0, 0);
|
|
_this.entityProcessors = new EntityProcessorList();
|
|
_this.entities = new EntityList(_this);
|
|
_this.addEventListener(egret.Event.ACTIVATE, _this.onActive, _this);
|
|
_this.addEventListener(egret.Event.DEACTIVATE, _this.onDeactive, _this);
|
|
_this.addEventListener(egret.Event.ENTER_FRAME, _this.update, _this);
|
|
return _this;
|
|
}
|
|
Scene.prototype.createEntity = function (name) {
|
|
var entity = new Entity(name);
|
|
entity.transform.position = new Vector2(0, 0);
|
|
return this.addEntity(entity);
|
|
};
|
|
Scene.prototype.addEntity = function (entity) {
|
|
this.entities.add(entity);
|
|
entity.scene = this;
|
|
for (var i = 0; i < entity.transform.childCount; i++)
|
|
this.addEntity(entity.transform.getChild(i).entity);
|
|
return entity;
|
|
};
|
|
Scene.prototype.destroyAllEntities = function () {
|
|
for (var i = 0; i < this.entities.count; i++) {
|
|
this.entities.buffer[i].destory();
|
|
}
|
|
};
|
|
Scene.prototype.findEntity = function (name) {
|
|
return this.entities.findEntity(name);
|
|
};
|
|
Scene.prototype.addEntityProcessor = function (processor) {
|
|
processor.scene = this;
|
|
this.entityProcessors.add(processor);
|
|
return processor;
|
|
};
|
|
Scene.prototype.removeEntityProcessor = function (processor) {
|
|
this.entityProcessors.remove(processor);
|
|
};
|
|
Scene.prototype.getEntityProcessor = function () {
|
|
return this.entityProcessors.getProcessor();
|
|
};
|
|
Scene.prototype.setActive = function () {
|
|
SceneManager.setActiveScene(this);
|
|
return this;
|
|
};
|
|
Scene.prototype.initialize = function () {
|
|
this.camera = this.createEntity("camera").addComponent(new Camera());
|
|
if (this.entityProcessors)
|
|
this.entityProcessors.begin();
|
|
};
|
|
Scene.prototype.onActive = function () {
|
|
};
|
|
Scene.prototype.onDeactive = function () {
|
|
};
|
|
Scene.prototype.update = function () {
|
|
Time.update(egret.getTimer());
|
|
this.entities.updateLists();
|
|
if (this.entityProcessors)
|
|
this.entityProcessors.update();
|
|
this.entities.update();
|
|
if (this.entityProcessors)
|
|
this.entityProcessors.lateUpdate();
|
|
};
|
|
Scene.prototype.prepRenderState = function () {
|
|
this._projectionMatrix.m11 = 2 / this.stage.width;
|
|
this._projectionMatrix.m22 = -2 / this.stage.height;
|
|
this._transformMatrix = this.camera.transformMatrix;
|
|
this._matrixTransformMatrix = Matrix2D.multiply(this._transformMatrix, this._projectionMatrix);
|
|
};
|
|
Scene.prototype.destory = function () {
|
|
this.removeEventListener(egret.Event.DEACTIVATE, this.onDeactive, this);
|
|
this.removeEventListener(egret.Event.ACTIVATE, this.onActive, this);
|
|
this.camera.destory();
|
|
this.camera = null;
|
|
this.entities.removeAllEntities();
|
|
};
|
|
return Scene;
|
|
}(egret.DisplayObjectContainer));
|
|
var SceneManager = (function () {
|
|
function SceneManager() {
|
|
}
|
|
SceneManager.createScene = function (name, scene) {
|
|
scene.name = name;
|
|
this._loadedScenes.set(name, scene);
|
|
return scene;
|
|
};
|
|
SceneManager.setActiveScene = function (scene) {
|
|
if (this._activeScene) {
|
|
if (this._activeScene == scene)
|
|
return;
|
|
this._lastScene = this._activeScene;
|
|
this._activeScene.destory();
|
|
}
|
|
this._activeScene = scene;
|
|
this._activeScene.initialize();
|
|
return scene;
|
|
};
|
|
SceneManager.getActiveScene = function () {
|
|
return this._activeScene;
|
|
};
|
|
SceneManager._loadedScenes = new Map();
|
|
return SceneManager;
|
|
}());
|
|
var DirtyType;
|
|
(function (DirtyType) {
|
|
DirtyType[DirtyType["clean"] = 0] = "clean";
|
|
DirtyType[DirtyType["positionDirty"] = 1] = "positionDirty";
|
|
DirtyType[DirtyType["scaleDirty"] = 2] = "scaleDirty";
|
|
DirtyType[DirtyType["rotationDirty"] = 3] = "rotationDirty";
|
|
})(DirtyType || (DirtyType = {}));
|
|
var Transform = (function () {
|
|
function Transform(entity) {
|
|
this._localRotation = 0;
|
|
this._worldTransform = Matrix2D.identity;
|
|
this._worldToLocalTransform = Matrix2D.identity;
|
|
this._worldInverseTransform = Matrix2D.identity;
|
|
this._rotation = 0;
|
|
this.entity = entity;
|
|
this._scale = this._localScale = Vector2.One;
|
|
this._children = [];
|
|
}
|
|
Object.defineProperty(Transform.prototype, "childCount", {
|
|
get: function () {
|
|
return this._children.length;
|
|
},
|
|
enumerable: true,
|
|
configurable: true
|
|
});
|
|
Transform.prototype.getChild = function (index) {
|
|
return this._children[index];
|
|
};
|
|
Object.defineProperty(Transform.prototype, "parent", {
|
|
get: function () {
|
|
return this._parent;
|
|
},
|
|
set: function (value) {
|
|
this.setParent(value);
|
|
},
|
|
enumerable: true,
|
|
configurable: true
|
|
});
|
|
Transform.prototype.setParent = function (parent) {
|
|
if (this._parent == parent)
|
|
return this;
|
|
if (this._parent)
|
|
this._parent._children.remove(this);
|
|
if (parent)
|
|
parent._children.push(this);
|
|
this._parent = parent;
|
|
return this;
|
|
};
|
|
Object.defineProperty(Transform.prototype, "position", {
|
|
get: function () {
|
|
this.updateTransform();
|
|
if (!this.parent) {
|
|
this._position = this._localPosition;
|
|
}
|
|
else {
|
|
this.parent.updateTransform();
|
|
this._position = Vector2.transform(this._localPosition, this.parent._worldTransform);
|
|
}
|
|
return this._position;
|
|
},
|
|
set: function (value) {
|
|
this.setPosition(value);
|
|
},
|
|
enumerable: true,
|
|
configurable: true
|
|
});
|
|
Object.defineProperty(Transform.prototype, "localPosition", {
|
|
get: function () {
|
|
this.updateTransform();
|
|
return this._localPosition;
|
|
},
|
|
set: function (value) {
|
|
this.setLocalPosition(value);
|
|
},
|
|
enumerable: true,
|
|
configurable: true
|
|
});
|
|
Transform.prototype.setLocalPosition = function (localPosition) {
|
|
if (localPosition == this._localPosition)
|
|
return this;
|
|
this._localPosition = localPosition;
|
|
this._localDirty = this._positionDirty = this._localPositionDirty = this._localRotationDirty = this._localScaleDirty = true;
|
|
return this;
|
|
};
|
|
Transform.prototype.setPosition = function (position) {
|
|
if (position == this._position)
|
|
return this;
|
|
this._position = position;
|
|
if (this.parent) {
|
|
this.localPosition = Vector2.transform(this._position, this._worldToLocalTransform);
|
|
}
|
|
else {
|
|
this.localPosition = position;
|
|
}
|
|
for (var i = 0; i < this.entity.components.length; i++) {
|
|
var component = this.entity.components[i];
|
|
if (component.displayRender) {
|
|
component.displayRender.x = this.entity.scene.camera.transformMatrix.m31 + this.position.x;
|
|
component.displayRender.y = this.entity.scene.camera.transformMatrix.m32 + this.position.y;
|
|
}
|
|
}
|
|
return this;
|
|
};
|
|
Transform.prototype.updateTransform = function () {
|
|
if (this._hierachyDirty != DirtyType.clean) {
|
|
if (this.parent)
|
|
this.parent.updateTransform();
|
|
if (this._localDirty) {
|
|
if (this._localPositionDirty) {
|
|
this._translationMatrix = Matrix2D.createTranslation(this._localPosition.x, this._localPosition.y);
|
|
this._localPositionDirty = false;
|
|
}
|
|
if (this._localRotationDirty) {
|
|
this._rotationMatrix = Matrix2D.createRotation(this._localRotation);
|
|
this._localRotationDirty = false;
|
|
}
|
|
if (this._localScaleDirty) {
|
|
this._scaleMatrix = Matrix2D.createScale(this._localScale.x, this._localScale.y);
|
|
this._localScaleDirty = false;
|
|
}
|
|
this._localTransform = Matrix2D.multiply(this._scaleMatrix, this._rotationMatrix);
|
|
this._localTransform = Matrix2D.multiply(this._localTransform, this._translationMatrix);
|
|
if (!this.parent) {
|
|
this._worldTransform = this._localTransform;
|
|
this._rotation = this._localRotation;
|
|
this._scale = this._localScale;
|
|
this._worldInverseDirty = true;
|
|
}
|
|
this._localDirty = false;
|
|
}
|
|
if (this.parent) {
|
|
this._worldTransform = Matrix2D.multiply(this._localTransform, this.parent._worldTransform);
|
|
this._rotation = this._localRotation + this.parent._rotation;
|
|
this._scale = Vector2.multiply(this.parent._scale, this._localScale);
|
|
this._worldInverseDirty = true;
|
|
}
|
|
this._worldToLocalDirty = true;
|
|
this._positionDirty = true;
|
|
this._hierachyDirty = DirtyType.clean;
|
|
}
|
|
};
|
|
return Transform;
|
|
}());
|
|
var Camera = (function (_super) {
|
|
__extends(Camera, _super);
|
|
function Camera() {
|
|
var _this = _super.call(this) || this;
|
|
_this._transformMatrix = Matrix2D.identity;
|
|
_this._inverseTransformMatrix = Matrix2D.identity;
|
|
return _this;
|
|
}
|
|
Object.defineProperty(Camera.prototype, "transformMatrix", {
|
|
get: function () {
|
|
this.updateMatrixes();
|
|
return this._transformMatrix;
|
|
},
|
|
enumerable: true,
|
|
configurable: true
|
|
});
|
|
Camera.prototype.initialize = function () {
|
|
};
|
|
Camera.prototype.update = function () {
|
|
var _this = this;
|
|
SceneManager.getActiveScene().entities.buffer.forEach(function (entity) { return entity.components.forEach(function (component) {
|
|
if (component.displayRender) {
|
|
var has = _this.entity.scene.$children.indexOf(component.displayRender);
|
|
if (has == -1) {
|
|
_this.entity.scene.stage.addChild(component.displayRender);
|
|
}
|
|
}
|
|
}); });
|
|
};
|
|
Camera.prototype.setPosition = function (position) {
|
|
this.entity.transform.setPosition(position);
|
|
return this;
|
|
};
|
|
Camera.prototype.updateMatrixes = function () {
|
|
this._transformMatrix = Matrix2D.createTranslation(-this.entity.transform.position.x, -this.entity.transform.position.y);
|
|
};
|
|
Camera.prototype.destory = function () {
|
|
};
|
|
return Camera;
|
|
}(Component));
|
|
var EntitySystem = (function () {
|
|
function EntitySystem(matcher) {
|
|
this._entities = [];
|
|
this._matcher = matcher ? matcher : Matcher.empty();
|
|
}
|
|
Object.defineProperty(EntitySystem.prototype, "matcher", {
|
|
get: function () {
|
|
return this._matcher;
|
|
},
|
|
enumerable: true,
|
|
configurable: true
|
|
});
|
|
Object.defineProperty(EntitySystem.prototype, "scene", {
|
|
get: function () {
|
|
return this._scene;
|
|
},
|
|
set: function (value) {
|
|
this._scene = value;
|
|
this._entities = [];
|
|
},
|
|
enumerable: true,
|
|
configurable: true
|
|
});
|
|
EntitySystem.prototype.initialize = function () {
|
|
};
|
|
EntitySystem.prototype.onChanged = function (entity) {
|
|
var contains = this._entities.contains(entity);
|
|
var interest = this._matcher.IsIntersted(entity);
|
|
if (interest && !contains)
|
|
this.add(entity);
|
|
else if (!interest && contains)
|
|
this.remove(entity);
|
|
};
|
|
EntitySystem.prototype.add = function (entity) {
|
|
this._entities.push(entity);
|
|
this.onAdded(entity);
|
|
};
|
|
EntitySystem.prototype.onAdded = function (entity) {
|
|
};
|
|
EntitySystem.prototype.remove = function (entity) {
|
|
this._entities.remove(entity);
|
|
this.onRemoved(entity);
|
|
};
|
|
EntitySystem.prototype.onRemoved = function (entity) {
|
|
};
|
|
EntitySystem.prototype.update = function () {
|
|
this.begin();
|
|
this.process(this._entities);
|
|
};
|
|
EntitySystem.prototype.lateUpdate = function () {
|
|
this.lateProcess(this._entities);
|
|
this.end();
|
|
};
|
|
EntitySystem.prototype.begin = function () {
|
|
};
|
|
EntitySystem.prototype.process = function (entities) {
|
|
};
|
|
EntitySystem.prototype.lateProcess = function (entities) {
|
|
};
|
|
EntitySystem.prototype.end = function () {
|
|
};
|
|
return EntitySystem;
|
|
}());
|
|
var EntityProcessingSystem = (function (_super) {
|
|
__extends(EntityProcessingSystem, _super);
|
|
function EntityProcessingSystem(matcher) {
|
|
return _super.call(this, matcher) || this;
|
|
}
|
|
EntityProcessingSystem.prototype.lateProcessEntity = function (entity) {
|
|
};
|
|
EntityProcessingSystem.prototype.process = function (entities) {
|
|
var _this = this;
|
|
entities.forEach(function (entity) { return _this.processEntity(entity); });
|
|
};
|
|
EntityProcessingSystem.prototype.lateProcess = function (entities) {
|
|
var _this = this;
|
|
entities.forEach(function (entity) { return _this.lateProcessEntity(entity); });
|
|
};
|
|
return EntityProcessingSystem;
|
|
}(EntitySystem));
|
|
var BitSet = (function () {
|
|
function BitSet(nbits) {
|
|
if (nbits === void 0) { nbits = 64; }
|
|
var length = nbits >> 6;
|
|
if ((nbits & BitSet.LONG_MASK) != 0)
|
|
length++;
|
|
this._bits = new Array(length);
|
|
}
|
|
BitSet.prototype.and = function (bs) {
|
|
var max = Math.min(this._bits.length, bs._bits.length);
|
|
var i;
|
|
for (var i_1 = 0; i_1 < max; ++i_1)
|
|
this._bits[i_1] &= bs._bits[i_1];
|
|
while (i < this._bits.length)
|
|
this._bits[i++] = 0;
|
|
};
|
|
BitSet.prototype.andNot = function (bs) {
|
|
var i = Math.min(this._bits.length, bs._bits.length);
|
|
while (--i >= 0)
|
|
this._bits[i] &= ~bs._bits[i];
|
|
};
|
|
BitSet.prototype.cardinality = function () {
|
|
var card = 0;
|
|
for (var i = this._bits.length - 1; i >= 0; i--) {
|
|
var a = this._bits[i];
|
|
if (a == 0)
|
|
continue;
|
|
if (a == -1) {
|
|
card += 64;
|
|
continue;
|
|
}
|
|
a = ((a >> 1) & 0x5555555555555555) + (a & 0x5555555555555555);
|
|
a = ((a >> 2) & 0x3333333333333333) + (a & 0x3333333333333333);
|
|
var b = ((a >> 32) + a);
|
|
b = ((b >> 4) & 0x0f0f0f0f) + (b & 0x0f0f0f0f);
|
|
b = ((b >> 8) & 0x00ff00ff) + (b & 0x00ff00ff);
|
|
card += ((b >> 16) & 0x0000ffff) + (b & 0x0000ffff);
|
|
}
|
|
return card;
|
|
};
|
|
BitSet.prototype.clear = function (pos) {
|
|
if (pos != undefined) {
|
|
var offset = pos >> 6;
|
|
this.ensure(offset);
|
|
this._bits[offset] &= ~(1 << pos);
|
|
}
|
|
else {
|
|
for (var i = 0; i < this._bits.length; i++)
|
|
this._bits[i] = 0;
|
|
}
|
|
};
|
|
BitSet.prototype.ensure = function (lastElt) {
|
|
if (lastElt >= this._bits.length) {
|
|
var nd = new Number[lastElt + 1];
|
|
nd = this._bits.copyWithin(0, 0, this._bits.length);
|
|
this._bits = nd;
|
|
}
|
|
};
|
|
BitSet.prototype.get = function (pos) {
|
|
var offset = pos >> 6;
|
|
if (offset >= this._bits.length)
|
|
return false;
|
|
return (this._bits[offset] & (1 << pos)) != 0;
|
|
};
|
|
BitSet.prototype.intersects = function (set) {
|
|
var i = Math.min(this._bits.length, set._bits.length);
|
|
while (--i >= 0) {
|
|
if ((this._bits[i] & set._bits[i]) != 0)
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
BitSet.prototype.isEmpty = function () {
|
|
for (var i = this._bits.length - 1; i >= 0; i--) {
|
|
if (this._bits[i])
|
|
return false;
|
|
}
|
|
return true;
|
|
};
|
|
BitSet.prototype.nextSetBit = function (from) {
|
|
var offset = from >> 6;
|
|
var mask = 1 << from;
|
|
while (offset < this._bits.length) {
|
|
var h = this._bits[offset];
|
|
do {
|
|
if ((h & mask) != 0)
|
|
return from;
|
|
mask <<= 1;
|
|
from++;
|
|
} while (mask != 0);
|
|
mask = 1;
|
|
offset++;
|
|
}
|
|
return -1;
|
|
};
|
|
BitSet.prototype.set = function (pos, value) {
|
|
if (value === void 0) { value = true; }
|
|
if (value) {
|
|
var offset = pos >> 6;
|
|
this.ensure(offset);
|
|
this._bits[offset] |= 1 << pos;
|
|
}
|
|
else {
|
|
this.clear(pos);
|
|
}
|
|
};
|
|
BitSet.LONG_MASK = 0x3f;
|
|
return BitSet;
|
|
}());
|
|
var ComponentTypeManager = (function () {
|
|
function ComponentTypeManager() {
|
|
}
|
|
ComponentTypeManager.add = function (type) {
|
|
if (!this._componentTypesMask.has(type))
|
|
this._componentTypesMask[type] = this._componentTypesMask.size;
|
|
};
|
|
ComponentTypeManager.getIndexFor = function (type) {
|
|
var v = -1;
|
|
if (!this._componentTypesMask.has(type)) {
|
|
this.add(type);
|
|
v = this._componentTypesMask.get(type);
|
|
}
|
|
return v;
|
|
};
|
|
ComponentTypeManager._componentTypesMask = new Map();
|
|
return ComponentTypeManager;
|
|
}());
|
|
var EntityList = (function () {
|
|
function EntityList(scene) {
|
|
this._entitiesToRemove = [];
|
|
this._entitiesToAdded = [];
|
|
this._tempEntityList = [];
|
|
this._entities = [];
|
|
this.scene = scene;
|
|
}
|
|
Object.defineProperty(EntityList.prototype, "count", {
|
|
get: function () {
|
|
return this._entities.length;
|
|
},
|
|
enumerable: true,
|
|
configurable: true
|
|
});
|
|
Object.defineProperty(EntityList.prototype, "buffer", {
|
|
get: function () {
|
|
return this._entities;
|
|
},
|
|
enumerable: true,
|
|
configurable: true
|
|
});
|
|
EntityList.prototype.add = function (entity) {
|
|
this._entitiesToAdded.push(entity);
|
|
};
|
|
EntityList.prototype.remove = function (entity) {
|
|
if (this._entitiesToAdded.contains(entity)) {
|
|
this._entitiesToAdded.remove(entity);
|
|
return;
|
|
}
|
|
if (!this._entitiesToRemove.contains(entity))
|
|
this._entitiesToRemove.push(entity);
|
|
};
|
|
EntityList.prototype.findEntity = function (name) {
|
|
for (var i = 0; i < this._entities.length; i++) {
|
|
if (this._entities[i].name == name)
|
|
return this._entities[i];
|
|
}
|
|
return this._entitiesToAdded.firstOrDefault(function (entity) { return entity.name == name; });
|
|
};
|
|
EntityList.prototype.update = function () {
|
|
for (var i = 0; i < this._entities.length; i++) {
|
|
var entity = this._entities[i];
|
|
if (entity.enabled)
|
|
entity.update();
|
|
}
|
|
};
|
|
EntityList.prototype.removeAllEntities = function () {
|
|
this._entitiesToAdded.length = 0;
|
|
this.updateLists();
|
|
for (var i = 0; i < this._entities.length; i++) {
|
|
this._entities[i].scene = null;
|
|
}
|
|
this._entities.length = 0;
|
|
};
|
|
EntityList.prototype.updateLists = function () {
|
|
var _this = this;
|
|
if (this._entitiesToRemove.length > 0) {
|
|
var temp = this._entitiesToRemove;
|
|
this._entitiesToRemove = this._tempEntityList;
|
|
this._tempEntityList = temp;
|
|
this._tempEntityList.forEach(function (entity) {
|
|
_this._entities.remove(entity);
|
|
entity.scene = null;
|
|
_this.scene.entityProcessors.onEntityRemoved(entity);
|
|
});
|
|
this._tempEntityList.length = 0;
|
|
}
|
|
if (this._entitiesToAdded.length > 0) {
|
|
var temp = this._entitiesToAdded;
|
|
this._entitiesToAdded = this._tempEntityList;
|
|
this._tempEntityList = temp;
|
|
this._tempEntityList.forEach(function (entity) {
|
|
_this._entities.push(entity);
|
|
entity.scene = _this.scene;
|
|
_this.scene.entityProcessors.onEntityAdded(entity);
|
|
});
|
|
this._tempEntityList.length = 0;
|
|
}
|
|
};
|
|
return EntityList;
|
|
}());
|
|
var EntityProcessorList = (function () {
|
|
function EntityProcessorList() {
|
|
this._processors = [];
|
|
}
|
|
EntityProcessorList.prototype.add = function (processor) {
|
|
this._processors.push(processor);
|
|
};
|
|
EntityProcessorList.prototype.remove = function (processor) {
|
|
this._processors.remove(processor);
|
|
};
|
|
EntityProcessorList.prototype.onComponentAdded = function (entity) {
|
|
this.notifyEntityChanged(entity);
|
|
};
|
|
EntityProcessorList.prototype.onComponentRemoved = function (entity) {
|
|
this.notifyEntityChanged(entity);
|
|
};
|
|
EntityProcessorList.prototype.onEntityAdded = function (entity) {
|
|
this.notifyEntityChanged(entity);
|
|
};
|
|
EntityProcessorList.prototype.onEntityRemoved = function (entity) {
|
|
this.removeFromProcessors(entity);
|
|
};
|
|
EntityProcessorList.prototype.notifyEntityChanged = function (entity) {
|
|
for (var i = 0; i < this._processors.length; i++) {
|
|
this._processors[i].onChanged(entity);
|
|
}
|
|
};
|
|
EntityProcessorList.prototype.removeFromProcessors = function (entity) {
|
|
for (var i = 0; i < this._processors.length; i++) {
|
|
this._processors[i].remove(entity);
|
|
}
|
|
};
|
|
EntityProcessorList.prototype.begin = function () {
|
|
};
|
|
EntityProcessorList.prototype.update = function () {
|
|
for (var i = 0; i < this._processors.length; i++) {
|
|
this._processors[i].update();
|
|
}
|
|
};
|
|
EntityProcessorList.prototype.lateUpdate = function () {
|
|
for (var i = 0; i < this._processors.length; i++) {
|
|
this._processors[i].lateUpdate();
|
|
}
|
|
};
|
|
EntityProcessorList.prototype.end = function () {
|
|
};
|
|
EntityProcessorList.prototype.getProcessor = function () {
|
|
for (var i = 0; i < this._processors.length; i++) {
|
|
var processor = this._processors[i];
|
|
if (processor instanceof EntitySystem)
|
|
return processor;
|
|
}
|
|
return null;
|
|
};
|
|
return EntityProcessorList;
|
|
}());
|
|
var Matcher = (function () {
|
|
function Matcher() {
|
|
this.allSet = new BitSet();
|
|
this.exclusionSet = new BitSet();
|
|
this.oneSet = new BitSet();
|
|
}
|
|
Matcher.empty = function () {
|
|
return new Matcher();
|
|
};
|
|
Matcher.prototype.IsIntersted = function (e) {
|
|
if (!this.allSet.isEmpty()) {
|
|
for (var i = this.allSet.nextSetBit(0); i >= 0; i = this.allSet.nextSetBit(i + 1)) {
|
|
if (!e.componentBits.get(i))
|
|
return false;
|
|
}
|
|
}
|
|
if (!this.exclusionSet.isEmpty() && this.exclusionSet.intersects(e.componentBits))
|
|
return false;
|
|
if (!this.oneSet.isEmpty() && !this.oneSet.intersects(e.componentBits))
|
|
return false;
|
|
return true;
|
|
};
|
|
return Matcher;
|
|
}());
|
|
var Time = (function () {
|
|
function Time() {
|
|
}
|
|
Time.update = function (currentTime) {
|
|
var dt = (currentTime - this._lastTime) / 1000;
|
|
this.deltaTime = dt * this.timeScale;
|
|
this.unscaledDeltaTime = dt;
|
|
this._lastTime = currentTime;
|
|
};
|
|
Time.timeScale = 1;
|
|
Time._lastTime = 0;
|
|
return Time;
|
|
}());
|
|
var MathHelper = (function () {
|
|
function MathHelper() {
|
|
}
|
|
MathHelper.toDegrees = function (radians) {
|
|
return radians * 57.295779513082320876798154814105;
|
|
};
|
|
MathHelper.toRadians = function (degrees) {
|
|
return degrees * 0.017453292519943295769236907684886;
|
|
};
|
|
return MathHelper;
|
|
}());
|
|
var Matrix2D = (function () {
|
|
function Matrix2D(m11, m12, m21, m22, m31, m32) {
|
|
this.m11 = 0;
|
|
this.m12 = 0;
|
|
this.m21 = 0;
|
|
this.m22 = 0;
|
|
this.m31 = 0;
|
|
this.m32 = 0;
|
|
this.m11 = m11;
|
|
this.m12 = m12;
|
|
this.m21 = m21;
|
|
this.m22 = m22;
|
|
this.m31 = m31;
|
|
this.m32 = m32;
|
|
}
|
|
Object.defineProperty(Matrix2D, "identity", {
|
|
get: function () {
|
|
return Matrix2D._identity;
|
|
},
|
|
enumerable: true,
|
|
configurable: true
|
|
});
|
|
Object.defineProperty(Matrix2D.prototype, "translation", {
|
|
get: function () {
|
|
return new Vector2(this.m31, this.m32);
|
|
},
|
|
set: function (value) {
|
|
this.m31 = value.x;
|
|
this.m32 = value.y;
|
|
},
|
|
enumerable: true,
|
|
configurable: true
|
|
});
|
|
Object.defineProperty(Matrix2D.prototype, "rotation", {
|
|
get: function () {
|
|
return Math.atan2(this.m21, this.m11);
|
|
},
|
|
set: function (value) {
|
|
var val1 = Math.cos(value);
|
|
var val2 = Math.sin(value);
|
|
this.m11 = val1;
|
|
this.m12 = val2;
|
|
this.m21 = -val2;
|
|
this.m22 = val1;
|
|
},
|
|
enumerable: true,
|
|
configurable: true
|
|
});
|
|
Object.defineProperty(Matrix2D.prototype, "rotationDegrees", {
|
|
get: function () {
|
|
return MathHelper.toDegrees(this.rotation);
|
|
},
|
|
set: function (value) {
|
|
this.rotation = MathHelper.toRadians(value);
|
|
},
|
|
enumerable: true,
|
|
configurable: true
|
|
});
|
|
Object.defineProperty(Matrix2D.prototype, "scale", {
|
|
get: function () {
|
|
return new Vector2(this.m11, this.m22);
|
|
},
|
|
set: function (value) {
|
|
this.m11 = value.x;
|
|
this.m12 = value.y;
|
|
},
|
|
enumerable: true,
|
|
configurable: true
|
|
});
|
|
Matrix2D.add = function (matrix1, matrix2) {
|
|
matrix1.m11 += matrix2.m11;
|
|
matrix1.m12 += matrix2.m12;
|
|
matrix1.m21 += matrix2.m21;
|
|
matrix1.m22 += matrix2.m22;
|
|
matrix1.m31 += matrix2.m31;
|
|
matrix1.m32 += matrix2.m32;
|
|
return matrix1;
|
|
};
|
|
Matrix2D.divide = function (matrix1, matrix2) {
|
|
matrix1.m11 /= matrix2.m11;
|
|
matrix1.m12 /= matrix2.m12;
|
|
matrix1.m21 /= matrix2.m21;
|
|
matrix1.m22 /= matrix2.m22;
|
|
matrix1.m31 /= matrix2.m31;
|
|
matrix1.m32 /= matrix2.m32;
|
|
return matrix1;
|
|
};
|
|
Matrix2D.multiply = function (matrix1, matrix2) {
|
|
var m11 = (matrix1.m11 * matrix2.m11) + (matrix1.m12 * matrix2.m21);
|
|
var m12 = (matrix1.m11 * matrix2.m12) + (matrix1.m12 * matrix2.m22);
|
|
var m21 = (matrix1.m21 * matrix2.m11) + (matrix1.m22 * matrix2.m21);
|
|
var m22 = (matrix1.m21 * matrix2.m12) + (matrix1.m22 * matrix2.m22);
|
|
var m31 = (matrix1.m31 * matrix2.m11) + (matrix1.m32 * matrix2.m21) + matrix2.m31;
|
|
var m32 = (matrix1.m31 * matrix2.m12) + (matrix1.m32 * matrix2.m22) + matrix2.m32;
|
|
matrix1.m11 = m11;
|
|
matrix1.m12 = m12;
|
|
matrix1.m21 = m21;
|
|
matrix1.m22 = m22;
|
|
matrix1.m31 = m31;
|
|
matrix1.m32 = m32;
|
|
return matrix1;
|
|
};
|
|
Matrix2D.multiplyTranslation = function (matrix, x, y) {
|
|
var trans = Matrix2D.createTranslation(x, y);
|
|
return Matrix2D.multiply(matrix, trans);
|
|
};
|
|
Matrix2D.prototype.determinant = function () {
|
|
return this.m11 * this.m22 - this.m12 * this.m21;
|
|
};
|
|
Matrix2D.invert = function (matrix, result) {
|
|
var det = 1 / matrix.determinant();
|
|
result.m11 = matrix.m22 * det;
|
|
result.m12 = -matrix.m12 * det;
|
|
result.m21 = -matrix.m21 * det;
|
|
result.m22 = matrix.m11 * det;
|
|
result.m31 = (matrix.m32 * matrix.m21 - matrix.m31 * matrix.m22) * det;
|
|
result.m32 = -(matrix.m32 * matrix.m11 - matrix.m31 * matrix.m12) * det;
|
|
return result;
|
|
};
|
|
Matrix2D.createTranslation = function (xPosition, yPosition, result) {
|
|
if (result === void 0) { result = Matrix2D.identity; }
|
|
result.m11 = 1;
|
|
result.m12 = 0;
|
|
result.m21 = 0;
|
|
result.m22 = 1;
|
|
result.m31 = xPosition;
|
|
result.m32 = yPosition;
|
|
return result;
|
|
};
|
|
Matrix2D.createRotation = function (radians, result) {
|
|
result = Matrix2D.identity;
|
|
var val1 = Math.cos(radians);
|
|
var val2 = Math.sin(radians);
|
|
result.m11 = val1;
|
|
result.m12 = val2;
|
|
result.m21 = -val2;
|
|
result.m22 = val1;
|
|
return result;
|
|
};
|
|
Matrix2D.createScale = function (xScale, yScale, result) {
|
|
if (result === void 0) { result = Matrix2D.identity; }
|
|
result.m11 = xScale;
|
|
result.m12 = 0;
|
|
result.m21 = 0;
|
|
result.m22 = yScale;
|
|
result.m31 = 0;
|
|
result.m32 = 0;
|
|
return result;
|
|
};
|
|
Matrix2D._identity = new Matrix2D(1, 0, 0, 1, 0, 0);
|
|
return Matrix2D;
|
|
}());
|
|
var Vector2 = (function () {
|
|
function Vector2(x, y) {
|
|
this.x = 0;
|
|
this.y = 0;
|
|
this.x = x;
|
|
this.y = y;
|
|
}
|
|
Object.defineProperty(Vector2, "One", {
|
|
get: function () {
|
|
return this.unitVector2;
|
|
},
|
|
enumerable: true,
|
|
configurable: true
|
|
});
|
|
Vector2.add = function (value1, value2) {
|
|
value1.x += value2.x;
|
|
value1.y += value2.y;
|
|
return value1;
|
|
};
|
|
Vector2.divide = function (value1, value2) {
|
|
value1.x /= value2.x;
|
|
value1.y /= value2.y;
|
|
return value1;
|
|
};
|
|
Vector2.multiply = function (value1, value2) {
|
|
value1.x *= value2.x;
|
|
value1.y *= value2.y;
|
|
return value1;
|
|
};
|
|
Vector2.subtract = function (value1, value2) {
|
|
value1.x -= value2.x;
|
|
value1.y -= value2.y;
|
|
return value1;
|
|
};
|
|
Vector2.prototype.normalize = function () {
|
|
var val = 1 / Math.sqrt((this.x * this.x) + (this.y * this.y));
|
|
this.x *= val;
|
|
this.y *= val;
|
|
};
|
|
Vector2.transform = function (position, matrix) {
|
|
return new Vector2((position.x * matrix.m11) + (position.y * matrix.m21), (position.x * matrix.m12) + (position.y * matrix.m22));
|
|
};
|
|
Vector2.unitVector2 = new Vector2(1, 1);
|
|
return Vector2;
|
|
}());
|