性能优化

This commit is contained in:
YHH
2022-03-07 16:00:48 +08:00
parent 3f7ef284fc
commit e207952786
9 changed files with 366 additions and 393 deletions
+185 -251
View File
@@ -2474,7 +2474,6 @@ var es;
es.Debug.warnIf(this._collider == null, "ArcadeRigidbody 没有 Collider。ArcadeRigidbody需要一个Collider!"); es.Debug.warnIf(this._collider == null, "ArcadeRigidbody 没有 Collider。ArcadeRigidbody需要一个Collider!");
}; };
ArcadeRigidbody.prototype.update = function () { ArcadeRigidbody.prototype.update = function () {
var e_1, _a;
if (this.isImmovable || this._collider == null) { if (this.isImmovable || this._collider == null) {
this.velocity = es.Vector2.zero; this.velocity = es.Vector2.zero;
return; return;
@@ -2485,9 +2484,9 @@ var es;
var collisionResult = new es.CollisionResult(); var collisionResult = new es.CollisionResult();
// 捞取我们在新的位置上可能会碰撞到的任何东西 // 捞取我们在新的位置上可能会碰撞到的任何东西
var neighbors = es.Physics.boxcastBroadphaseExcludingSelf(this._collider, this._collider.bounds, this._collider.collidesWithLayers.value); var neighbors = es.Physics.boxcastBroadphaseExcludingSelf(this._collider, this._collider.bounds, this._collider.collidesWithLayers.value);
try { if (neighbors.length > 0) {
for (var neighbors_1 = __values(neighbors), neighbors_1_1 = neighbors_1.next(); !neighbors_1_1.done; neighbors_1_1 = neighbors_1.next()) { for (var i = 0; i < neighbors.length; i++) {
var neighbor = neighbors_1_1.value; var neighbor = neighbors[i];
if (!neighbor) if (!neighbor)
continue; continue;
// 如果邻近的对撞机是同一个实体,则忽略它 // 如果邻近的对撞机是同一个实体,则忽略它
@@ -2510,13 +2509,6 @@ var es;
} }
} }
} }
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (neighbors_1_1 && !neighbors_1_1.done && (_a = neighbors_1.return)) _a.call(neighbors_1);
}
finally { if (e_1) throw e_1.error; }
}
}; };
/** /**
* 将两个重叠的刚体分开也处理其中一个不可移动的情况 * 将两个重叠的刚体分开也处理其中一个不可移动的情况
@@ -3004,22 +2996,14 @@ var es;
function TriggerListenerHelper() { function TriggerListenerHelper() {
} }
TriggerListenerHelper.getITriggerListener = function (entity, components) { TriggerListenerHelper.getITriggerListener = function (entity, components) {
var e_2, _a; if (entity.components._components.length > 0) {
try { for (var i = 0; i < entity.components._components.length; i++) {
for (var _b = __values(entity.components._components), _c = _b.next(); !_c.done; _c = _b.next()) { var component = entity.components._components[i];
var component = _c.value;
if (es.isITriggerListener(component)) { if (es.isITriggerListener(component)) {
components.push(component); components.push(component);
} }
} }
} }
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_2) throw e_2.error; }
}
for (var i in entity.components._componentsToAdd) { for (var i in entity.components._componentsToAdd) {
var component = entity.components._componentsToAdd[i]; var component = entity.components._componentsToAdd[i];
if (es.isITriggerListener(component)) { if (es.isITriggerListener(component)) {
@@ -3056,63 +3040,59 @@ var es;
* @param collisionResult * @param collisionResult
*/ */
Mover.prototype.calculateMovement = function (motion, collisionResult) { Mover.prototype.calculateMovement = function (motion, collisionResult) {
var e_3, _a;
var collider = null; var collider = null;
for (var i = 0; i < this.entity.components.buffer.length; i++) { if (this.entity.components.buffer.length > 0)
var component = this.entity.components.buffer[i]; for (var i = 0; i < this.entity.components.buffer.length; i++) {
if (component instanceof es.Collider) { var component = this.entity.components.buffer[i];
collider = component; if (component instanceof es.Collider) {
break; collider = component;
break;
}
} }
}
if (collider == null || this._triggerHelper == null) { if (collider == null || this._triggerHelper == null) {
return false; return false;
} }
// 移动所有的非触发碰撞器并获得最近的碰撞 // 移动所有的非触发碰撞器并获得最近的碰撞
var colliders = []; var colliders = [];
for (var i = 0; i < this.entity.components.buffer.length; i++) { if (this.entity.components.buffer.length > 0)
var component = this.entity.components.buffer[i]; for (var i = 0; i < this.entity.components.buffer.length; i++) {
if (component instanceof es.Collider) { var component = this.entity.components.buffer[i];
colliders.push(component); if (component instanceof es.Collider) {
colliders.push(component);
}
} }
} if (colliders.length > 0) {
for (var i = 0; i < colliders.length; i++) { for (var i = 0; i < colliders.length; i++) {
var collider_1 = colliders[i]; var collider_1 = colliders[i];
// 不检测触发器 在我们移动后会重新访问它 // 不检测触发器 在我们移动后会重新访问它
if (collider_1.isTrigger) if (collider_1.isTrigger)
continue; continue;
// 获取我们在新位置可能发生碰撞的任何东西 // 获取我们在新位置可能发生碰撞的任何东西
var bounds = collider_1.bounds.clone(); var bounds = collider_1.bounds;
bounds.x += motion.x; bounds.x += motion.x;
bounds.y += motion.y; bounds.y += motion.y;
var neighbors = es.Physics.boxcastBroadphaseExcludingSelf(collider_1, bounds, collider_1.collidesWithLayers.value); var neighbors = es.Physics.boxcastBroadphaseExcludingSelf(collider_1, bounds, collider_1.collidesWithLayers.value);
try { if (neighbors.length > 0) {
for (var neighbors_2 = __values(neighbors), neighbors_2_1 = neighbors_2.next(); !neighbors_2_1.done; neighbors_2_1 = neighbors_2.next()) { for (var i_1 = 0; i_1 < neighbors.length; i_1++) {
var neighbor = neighbors_2_1.value; var neighbor = neighbors[i_1];
// 不检测触发器 // 不检测触发器
if (neighbor.isTrigger) if (neighbor.isTrigger)
return; return;
var _internalcollisionResult = new es.CollisionResult(); var _internalcollisionResult = new es.CollisionResult();
if (collider_1.collidesWith(neighbor, motion, _internalcollisionResult)) { if (collider_1.collidesWith(neighbor, motion, _internalcollisionResult)) {
// 如果碰撞 则退回之前的移动量 // 如果碰撞 则退回之前的移动量
motion.subEqual(_internalcollisionResult.minimumTranslationVector); motion.subEqual(_internalcollisionResult.minimumTranslationVector);
// 如果我们碰到多个对象,为了简单起见,只取第一个。 // 如果我们碰到多个对象,为了简单起见,只取第一个。
if (_internalcollisionResult.collider != null) { if (_internalcollisionResult.collider != null) {
collisionResult.collider = _internalcollisionResult.collider; collisionResult.collider = _internalcollisionResult.collider;
collisionResult.minimumTranslationVector = _internalcollisionResult.minimumTranslationVector; collisionResult.minimumTranslationVector = _internalcollisionResult.minimumTranslationVector;
collisionResult.normal = _internalcollisionResult.normal; collisionResult.normal = _internalcollisionResult.normal;
collisionResult.point = _internalcollisionResult.point; collisionResult.point = _internalcollisionResult.point;
}
} }
} }
} }
} }
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (neighbors_2_1 && !neighbors_2_1.done && (_a = neighbors_2.return)) _a.call(neighbors_2);
}
finally { if (e_3) throw e_3.error; }
}
} }
es.ListPool.free(es.Collider, colliders); es.ListPool.free(es.Collider, colliders);
return collisionResult.collider != null; return collisionResult.collider != null;
@@ -3412,19 +3392,18 @@ var es;
* @param result * @param result
*/ */
Collider.prototype.collidesWithAny = function (motion, result) { Collider.prototype.collidesWithAny = function (motion, result) {
var e_4, _a;
// 在我们的新位置上获取我们可能会碰到的任何东西 // 在我们的新位置上获取我们可能会碰到的任何东西
var colliderBounds = this.bounds.clone(); var colliderBounds = this.bounds.clone();
colliderBounds.x += motion.x; colliderBounds.x += motion.x;
colliderBounds.y += motion.y; colliderBounds.y += motion.y;
var neighbors = es.Physics.boxcastBroadphaseExcludingSelf(this, colliderBounds, this.collidesWithLayers.value); var neighbors = es.Physics.boxcastBroadphaseExcludingSelf(this, colliderBounds, this.collidesWithLayers.value);
// 更改形状位置,使其处于移动后的位置,以便我们检查是否有重叠 // 更改形状位置,使其处于移动后的位置,以便我们检查是否有重叠
var oldPosition = this.shape.position.clone(); var oldPosition = this.shape.position;
this.shape.position = es.Vector2.add(this.shape.position, motion); this.shape.position = es.Vector2.add(this.shape.position, motion);
var didCollide = false; var didCollide = false;
try { if (neighbors.length > 0) {
for (var neighbors_3 = __values(neighbors), neighbors_3_1 = neighbors_3.next(); !neighbors_3_1.done; neighbors_3_1 = neighbors_3.next()) { for (var i = 0; i < neighbors.length; i++) {
var neighbor = neighbors_3_1.value; var neighbor = neighbors[i];
if (neighbor.isTrigger) if (neighbor.isTrigger)
continue; continue;
if (this.collidesWithNonMotion(neighbor, result)) { if (this.collidesWithNonMotion(neighbor, result)) {
@@ -3434,15 +3413,8 @@ var es;
} }
} }
} }
catch (e_4_1) { e_4 = { error: e_4_1 }; }
finally {
try {
if (neighbors_3_1 && !neighbors_3_1.done && (_a = neighbors_3.return)) _a.call(neighbors_3);
}
finally { if (e_4) throw e_4.error; }
}
// 将形状位置返回到检查之前的位置 // 将形状位置返回到检查之前的位置
this.shape.position = oldPosition.clone(); this.shape.position = oldPosition;
return didCollide; return didCollide;
}; };
/** /**
@@ -3451,24 +3423,24 @@ var es;
*/ */
Collider.prototype.collidesWithAnyNonMotion = function (result) { Collider.prototype.collidesWithAnyNonMotion = function (result) {
if (result === void 0) { result = new es.CollisionResult(); } if (result === void 0) { result = new es.CollisionResult(); }
var e_5, _a; var e_1, _a;
// 在我们的新位置上获取我们可能会碰到的任何东西 // 在我们的新位置上获取我们可能会碰到的任何东西
var neighbors = es.Physics.boxcastBroadphaseExcludingSelfNonRect(this, this.collidesWithLayers.value); var neighbors = es.Physics.boxcastBroadphaseExcludingSelfNonRect(this, this.collidesWithLayers.value);
try { try {
for (var neighbors_4 = __values(neighbors), neighbors_4_1 = neighbors_4.next(); !neighbors_4_1.done; neighbors_4_1 = neighbors_4.next()) { for (var neighbors_1 = __values(neighbors), neighbors_1_1 = neighbors_1.next(); !neighbors_1_1.done; neighbors_1_1 = neighbors_1.next()) {
var neighbor = neighbors_4_1.value; var neighbor = neighbors_1_1.value;
if (neighbor.isTrigger) if (neighbor.isTrigger)
continue; continue;
if (this.collidesWithNonMotion(neighbor, result)) if (this.collidesWithNonMotion(neighbor, result))
return true; return true;
} }
} }
catch (e_5_1) { e_5 = { error: e_5_1 }; } catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally { finally {
try { try {
if (neighbors_4_1 && !neighbors_4_1.done && (_a = neighbors_4.return)) _a.call(neighbors_4); if (neighbors_1_1 && !neighbors_1_1.done && (_a = neighbors_1.return)) _a.call(neighbors_1);
} }
finally { if (e_5) throw e_5.error; } finally { if (e_1) throw e_1.error; }
} }
return false; return false;
}; };
@@ -4772,7 +4744,7 @@ var es;
* @param tag * @param tag
*/ */
EntityList.prototype.entitiesWithTag = function (tag) { EntityList.prototype.entitiesWithTag = function (tag) {
var e_6, _a; var e_2, _a;
var list = this.getTagList(tag); var list = this.getTagList(tag);
var returnList = es.ListPool.obtain(es.Entity); var returnList = es.ListPool.obtain(es.Entity);
if (list.size > 0) { if (list.size > 0) {
@@ -4782,12 +4754,12 @@ var es;
returnList.push(entity); returnList.push(entity);
} }
} }
catch (e_6_1) { e_6 = { error: e_6_1 }; } catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally { finally {
try { try {
if (list_1_1 && !list_1_1.done && (_a = list_1.return)) _a.call(list_1); if (list_1_1 && !list_1_1.done && (_a = list_1.return)) _a.call(list_1);
} }
finally { if (e_6) throw e_6.error; } finally { if (e_2) throw e_2.error; }
} }
} }
return returnList; return returnList;
@@ -4798,7 +4770,7 @@ var es;
* @returns * @returns
*/ */
EntityList.prototype.entityWithTag = function (tag) { EntityList.prototype.entityWithTag = function (tag) {
var e_7, _a; var e_3, _a;
var list = this.getTagList(tag); var list = this.getTagList(tag);
if (list.size > 0) { if (list.size > 0) {
try { try {
@@ -4807,12 +4779,12 @@ var es;
return entity; return entity;
} }
} }
catch (e_7_1) { e_7 = { error: e_7_1 }; } catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally { finally {
try { try {
if (list_2_1 && !list_2_1.done && (_a = list_2.return)) _a.call(list_2); if (list_2_1 && !list_2_1.done && (_a = list_2.return)) _a.call(list_2);
} }
finally { if (e_7) throw e_7.error; } finally { if (e_3) throw e_3.error; }
} }
} }
return null; return null;
@@ -7803,59 +7775,54 @@ var es;
* 它将处理任何与Collider重叠的ITriggerListeners * 它将处理任何与Collider重叠的ITriggerListeners
*/ */
ColliderTriggerHelper.prototype.update = function () { ColliderTriggerHelper.prototype.update = function () {
var e_8, _a;
var lateColliders = []; var lateColliders = [];
// 对所有实体.colliders进行重叠检查,这些实体.colliders是触发器,与所有宽相碰撞器,无论是否触发器。 // 对所有实体.colliders进行重叠检查,这些实体.colliders是触发器,与所有宽相碰撞器,无论是否触发器。
// 任何重叠都会导致触发事件 // 任何重叠都会导致触发事件
var colliders = this.getColliders(); var colliders = this.getColliders();
for (var i = 0; i < colliders.length; i++) { if (colliders.length > 0) {
var collider = colliders[i]; for (var i = 0; i < colliders.length; i++) {
var neighbors = es.Physics.boxcastBroadphaseExcludingSelf(collider, collider.bounds, collider.collidesWithLayers.value); var collider = colliders[i];
for (var j = 0; j < neighbors.length; j++) { var neighbors = es.Physics.boxcastBroadphaseExcludingSelf(collider, collider.bounds, collider.collidesWithLayers.value);
var neighbor = neighbors[j]; for (var j = 0; j < neighbors.length; j++) {
// 我们至少需要一个碰撞器作为触发器 var neighbor = neighbors[j];
if (!collider.isTrigger && !neighbor.isTrigger) // 我们至少需要一个碰撞器作为触发器
continue; if (!collider.isTrigger && !neighbor.isTrigger)
if (collider.overlaps(neighbor)) { continue;
var pair = new es.Pair(collider, neighbor); if (collider.overlaps(neighbor)) {
// 如果我们的某一个集合中已经有了这个对子(前一个或当前的触发交叉点),就不要调用输入事件了 var pair = new es.Pair(collider, neighbor);
var shouldReportTriggerEvent = !this._activeTriggerIntersections.has(pair) && // 如果我们的某一个集合中已经有了这个对子(前一个或当前的触发交叉点),就不要调用输入事件了
!this._previousTriggerIntersections.has(pair); var shouldReportTriggerEvent = !this._activeTriggerIntersections.has(pair) &&
if (shouldReportTriggerEvent) { !this._previousTriggerIntersections.has(pair);
if (neighbor.castSortOrder >= es.Collider.lateSortOrder) { if (shouldReportTriggerEvent) {
lateColliders.push(pair); if (neighbor.castSortOrder >= es.Collider.lateSortOrder) {
} lateColliders.push(pair);
else { }
this.notifyTriggerListeners(pair, true); else {
this.notifyTriggerListeners(pair, true);
}
} }
this._activeTriggerIntersections.add(pair);
} }
this._activeTriggerIntersections.add(pair);
} }
} }
} }
try { if (lateColliders.length > 0) {
for (var lateColliders_1 = __values(lateColliders), lateColliders_1_1 = lateColliders_1.next(); !lateColliders_1_1.done; lateColliders_1_1 = lateColliders_1.next()) { for (var i = 0; i < lateColliders.length; i++) {
var pair = lateColliders_1_1.value; var pair = lateColliders[i];
this.notifyTriggerListeners(pair, true); this.notifyTriggerListeners(pair, true);
} }
} }
catch (e_8_1) { e_8 = { error: e_8_1 }; }
finally {
try {
if (lateColliders_1_1 && !lateColliders_1_1.done && (_a = lateColliders_1.return)) _a.call(lateColliders_1);
}
finally { if (e_8) throw e_8.error; }
}
this.checkForExitedColliders(); this.checkForExitedColliders();
}; };
ColliderTriggerHelper.prototype.getColliders = function () { ColliderTriggerHelper.prototype.getColliders = function () {
var colliders = []; var colliders = [];
for (var i = 0; i < this._entity.components.buffer.length; i++) { if (this._entity.components.buffer.length > 0)
var component = this._entity.components.buffer[i]; for (var i = 0; i < this._entity.components.buffer.length; i++) {
if (component instanceof es.Collider) { var component = this._entity.components.buffer[i];
colliders.push(component); if (component instanceof es.Collider) {
colliders.push(component);
}
} }
}
return colliders; return colliders;
}; };
ColliderTriggerHelper.prototype.checkForExitedColliders = function () { ColliderTriggerHelper.prototype.checkForExitedColliders = function () {
@@ -7874,27 +7841,31 @@ var es;
}; };
ColliderTriggerHelper.prototype.notifyTriggerListeners = function (collisionPair, isEntering) { ColliderTriggerHelper.prototype.notifyTriggerListeners = function (collisionPair, isEntering) {
es.TriggerListenerHelper.getITriggerListener(collisionPair.first.entity, this._tempTriggerList); es.TriggerListenerHelper.getITriggerListener(collisionPair.first.entity, this._tempTriggerList);
for (var i = 0; i < this._tempTriggerList.length; i++) { if (this._tempTriggerList.length > 0)
if (isEntering) { for (var i = 0; i < this._tempTriggerList.length; i++) {
this._tempTriggerList[i].onTriggerEnter(collisionPair.second, collisionPair.first); var trigger = this._tempTriggerList[i];
} if (isEntering) {
else { trigger.onTriggerEnter(collisionPair.second, collisionPair.first);
this._tempTriggerList[i].onTriggerExit(collisionPair.second, collisionPair.first); }
} else {
this._tempTriggerList.length = 0; trigger.onTriggerExit(collisionPair.second, collisionPair.first);
if (collisionPair.second.entity) {
es.TriggerListenerHelper.getITriggerListener(collisionPair.second.entity, this._tempTriggerList);
for (var i_1 = 0; i_1 < this._tempTriggerList.length; i_1++) {
if (isEntering) {
this._tempTriggerList[i_1].onTriggerEnter(collisionPair.first, collisionPair.second);
}
else {
this._tempTriggerList[i_1].onTriggerExit(collisionPair.first, collisionPair.second);
}
} }
this._tempTriggerList.length = 0; this._tempTriggerList.length = 0;
if (collisionPair.second.entity) {
es.TriggerListenerHelper.getITriggerListener(collisionPair.second.entity, this._tempTriggerList);
if (this._tempTriggerList.length > 0)
for (var i_2 = 0; i_2 < this._tempTriggerList.length; i_2++) {
var trigger_1 = this._tempTriggerList[i_2];
if (isEntering) {
trigger_1.onTriggerEnter(collisionPair.first, collisionPair.second);
}
else {
trigger_1.onTriggerExit(collisionPair.first, collisionPair.second);
}
}
this._tempTriggerList.length = 0;
}
} }
}
}; };
return ColliderTriggerHelper; return ColliderTriggerHelper;
}()); }());
@@ -8454,13 +8425,15 @@ var es;
if (!cell) if (!cell)
continue; continue;
// 当cell不为空。循环并取回所有碰撞器 // 当cell不为空。循环并取回所有碰撞器
for (var i = 0; i < cell.length; i++) { if (cell.length > 0) {
var collider = cell[i]; for (var i = 0; i < cell.length; i++) {
// 如果它是自身或者如果它不匹配我们的层掩码 跳过这个碰撞器 var collider = cell[i];
if (collider == excludeCollider || !es.Flags.isFlagSet(layerMask, collider.physicsLayer.value)) // 如果它是自身或者如果它不匹配我们的层掩码 跳过这个碰撞器
continue; if (collider == excludeCollider || !es.Flags.isFlagSet(layerMask, collider.physicsLayer.value))
if (bounds.intersects(collider.bounds)) { continue;
this._tempHashSet.add(collider); if (bounds.intersects(collider.bounds)) {
this._tempHashSet.add(collider);
}
} }
} }
} }
@@ -8535,43 +8508,33 @@ var es;
* @param layerMask * @param layerMask
*/ */
SpatialHash.prototype.overlapRectangle = function (rect, results, layerMask) { SpatialHash.prototype.overlapRectangle = function (rect, results, layerMask) {
var e_9, _a;
this._overlapTestBox.updateBox(rect.width, rect.height); this._overlapTestBox.updateBox(rect.width, rect.height);
this._overlapTestBox.position = rect.location.clone(); this._overlapTestBox.position = rect.location.clone();
var resultCounter = 0; var resultCounter = 0;
var potentials = this.aabbBroadphase(rect, null, layerMask); var potentials = this.aabbBroadphase(rect, null, layerMask);
try { for (var i = 0; i < potentials.length; i++) {
for (var potentials_1 = __values(potentials), potentials_1_1 = potentials_1.next(); !potentials_1_1.done; potentials_1_1 = potentials_1.next()) { var collider = potentials[i];
var collider = potentials_1_1.value; if (collider instanceof es.BoxCollider) {
if (collider instanceof es.BoxCollider) { results[resultCounter] = collider;
resultCounter++;
}
else if (collider instanceof es.CircleCollider) {
if (es.Collisions.rectToCircle(rect, collider.bounds.center, collider.bounds.width * 0.5)) {
results[resultCounter] = collider; results[resultCounter] = collider;
resultCounter++; resultCounter++;
} }
else if (collider instanceof es.CircleCollider) {
if (es.Collisions.rectToCircle(rect, collider.bounds.center, collider.bounds.width * 0.5)) {
results[resultCounter] = collider;
resultCounter++;
}
}
else if (collider instanceof es.PolygonCollider) {
if (collider.shape.overlaps(this._overlapTestBox)) {
results[resultCounter] = collider;
resultCounter++;
}
}
else {
throw new Error("overlapRectangle对这个类型没有实现!");
}
if (resultCounter == results.length)
return resultCounter;
} }
} else if (collider instanceof es.PolygonCollider) {
catch (e_9_1) { e_9 = { error: e_9_1 }; } if (collider.shape.overlaps(this._overlapTestBox)) {
finally { results[resultCounter] = collider;
try { resultCounter++;
if (potentials_1_1 && !potentials_1_1.done && (_a = potentials_1.return)) _a.call(potentials_1); }
} }
finally { if (e_9) throw e_9.error; } else {
throw new Error("overlapRectangle对这个类型没有实现!");
}
if (resultCounter == results.length)
return resultCounter;
} }
return resultCounter; return resultCounter;
}; };
@@ -8583,47 +8546,37 @@ var es;
* @param layerMask * @param layerMask
*/ */
SpatialHash.prototype.overlapCircle = function (circleCenter, radius, results, layerMask) { SpatialHash.prototype.overlapCircle = function (circleCenter, radius, results, layerMask) {
var e_10, _a;
var bounds = new es.Rectangle(circleCenter.x - radius, circleCenter.y - radius, radius * 2, radius * 2); var bounds = new es.Rectangle(circleCenter.x - radius, circleCenter.y - radius, radius * 2, radius * 2);
this._overlapTestCircle.radius = radius; this._overlapTestCircle.radius = radius;
this._overlapTestCircle.position = circleCenter; this._overlapTestCircle.position = circleCenter;
var resultCounter = 0; var resultCounter = 0;
var potentials = this.aabbBroadphase(bounds, null, layerMask); var potentials = this.aabbBroadphase(bounds, null, layerMask);
try { for (var i = 0; i < potentials.length; i++) {
for (var potentials_2 = __values(potentials), potentials_2_1 = potentials_2.next(); !potentials_2_1.done; potentials_2_1 = potentials_2.next()) { var collider = potentials[i];
var collider = potentials_2_1.value; if (collider instanceof es.BoxCollider) {
if (collider instanceof es.BoxCollider) { if (collider.shape.overlaps(this._overlapTestCircle)) {
if (collider.shape.overlaps(this._overlapTestCircle)) { results[resultCounter] = collider;
results[resultCounter] = collider; resultCounter++;
resultCounter++;
}
} }
else if (collider instanceof es.CircleCollider) {
if (collider.shape.overlaps(this._overlapTestCircle)) {
results[resultCounter] = collider;
resultCounter++;
}
}
else if (collider instanceof es.PolygonCollider) {
if (collider.shape.overlaps(this._overlapTestCircle)) {
results[resultCounter] = collider;
resultCounter++;
}
}
else {
throw new Error("对这个对撞机类型的overlapCircle没有实现!");
}
// 如果我们所有的结果数据有了则返回
if (resultCounter === results.length)
return resultCounter;
} }
} else if (collider instanceof es.CircleCollider) {
catch (e_10_1) { e_10 = { error: e_10_1 }; } if (collider.shape.overlaps(this._overlapTestCircle)) {
finally { results[resultCounter] = collider;
try { resultCounter++;
if (potentials_2_1 && !potentials_2_1.done && (_a = potentials_2.return)) _a.call(potentials_2); }
} }
finally { if (e_10) throw e_10.error; } else if (collider instanceof es.PolygonCollider) {
if (collider.shape.overlaps(this._overlapTestCircle)) {
results[resultCounter] = collider;
resultCounter++;
}
}
else {
throw new Error("对这个对撞机类型的overlapCircle没有实现!");
}
// 如果我们所有的结果数据有了则返回
if (resultCounter === results.length)
return resultCounter;
} }
return resultCounter; return resultCounter;
}; };
@@ -8669,9 +8622,8 @@ var es;
*/ */
NumberDictionary.prototype.remove = function (obj) { NumberDictionary.prototype.remove = function (obj) {
this._store.forEach(function (list) { this._store.forEach(function (list) {
var linqList = new es.List(list); var index = list.indexOf(obj);
if (linqList.contains(obj)) list.splice(index, 1);
linqList.remove(obj);
}); });
}; };
NumberDictionary.prototype.tryGetValue = function (x, y) { NumberDictionary.prototype.tryGetValue = function (x, y) {
@@ -8712,7 +8664,7 @@ var es;
for (var i = 0; i < cell.length; i++) { for (var i = 0; i < cell.length; i++) {
var potential = cell[i]; var potential = cell[i];
// 管理我们已经处理过的碰撞器 // 管理我们已经处理过的碰撞器
if (new es.List(this._checkedColliders).contains(potential)) if (this._checkedColliders.indexOf(potential) != -1)
continue; continue;
this._checkedColliders.push(potential); this._checkedColliders.push(potential);
// 只有当我们被设置为这样做时才会点击触发器 // 只有当我们被设置为这样做时才会点击触发器
@@ -12752,38 +12704,20 @@ var es;
this._all = []; this._all = [];
}; };
PairSet.prototype.union = function (other) { PairSet.prototype.union = function (other) {
var e_11, _a;
var otherAll = other.all; var otherAll = other.all;
try { if (otherAll.length > 0)
for (var otherAll_1 = __values(otherAll), otherAll_1_1 = otherAll_1.next(); !otherAll_1_1.done; otherAll_1_1 = otherAll_1.next()) { for (var i = 0; i < otherAll.length; i++) {
var elem = otherAll_1_1.value; var elem = otherAll[i];
this.add(elem); this.add(elem);
} }
}
catch (e_11_1) { e_11 = { error: e_11_1 }; }
finally {
try {
if (otherAll_1_1 && !otherAll_1_1.done && (_a = otherAll_1.return)) _a.call(otherAll_1);
}
finally { if (e_11) throw e_11.error; }
}
}; };
PairSet.prototype.except = function (other) { PairSet.prototype.except = function (other) {
var e_12, _a;
var otherAll = other.all; var otherAll = other.all;
try { if (otherAll.length > 0)
for (var otherAll_2 = __values(otherAll), otherAll_2_1 = otherAll_2.next(); !otherAll_2_1.done; otherAll_2_1 = otherAll_2.next()) { for (var i = 0; i < otherAll.length; i++) {
var elem = otherAll_2_1.value; var elem = otherAll[i];
this.remove(elem); this.remove(elem);
} }
}
catch (e_12_1) { e_12 = { error: e_12_1 }; }
finally {
try {
if (otherAll_2_1 && !otherAll_2_1.done && (_a = otherAll_2.return)) _a.call(otherAll_2);
}
finally { if (e_12) throw e_12.error; }
}
}; };
return PairSet; return PairSet;
}()); }());
@@ -14749,7 +14683,7 @@ var es;
* 创建一个Set从一个Enumerable.List< T> * 创建一个Set从一个Enumerable.List< T>
*/ */
List.prototype.toSet = function () { List.prototype.toSet = function () {
var e_13, _a; var e_4, _a;
var result = new Set(); var result = new Set();
try { try {
for (var _b = __values(this._elements), _c = _b.next(); !_c.done; _c = _b.next()) { for (var _b = __values(this._elements), _c = _b.next(); !_c.done; _c = _b.next()) {
@@ -14757,12 +14691,12 @@ var es;
result.add(x); result.add(x);
} }
} }
catch (e_13_1) { e_13 = { error: e_13_1 }; } catch (e_4_1) { e_4 = { error: e_4_1 }; }
finally { finally {
try { try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b); if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
} }
finally { if (e_13) throw e_13.error; } finally { if (e_4) throw e_4.error; }
} }
return result; return result;
}; };
@@ -15011,7 +14945,7 @@ var es;
* 计算可见性多边形并返回三角形扇形的顶点减去中心顶点返回的数组来自ListPool * 计算可见性多边形并返回三角形扇形的顶点减去中心顶点返回的数组来自ListPool
*/ */
VisibilityComputer.prototype.end = function () { VisibilityComputer.prototype.end = function () {
var e_14, _a; var e_5, _a;
var output = es.ListPool.obtain(es.Vector2); var output = es.ListPool.obtain(es.Vector2);
this.updateSegments(); this.updateSegments();
this._endPoints.sort(this._radialComparer.compare); this._endPoints.sort(this._radialComparer.compare);
@@ -15050,12 +14984,12 @@ var es;
} }
} }
} }
catch (e_14_1) { e_14 = { error: e_14_1 }; } catch (e_5_1) { e_5 = { error: e_5_1 }; }
finally { finally {
try { try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b); if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
} }
finally { if (e_14) throw e_14.error; } finally { if (e_5) throw e_5.error; }
} }
} }
VisibilityComputer._openSegments.clear(); VisibilityComputer._openSegments.clear();
@@ -15171,7 +15105,7 @@ var es;
* 处理片段以便我们稍后对它们进行分类 * 处理片段以便我们稍后对它们进行分类
*/ */
VisibilityComputer.prototype.updateSegments = function () { VisibilityComputer.prototype.updateSegments = function () {
var e_15, _a; var e_6, _a;
try { try {
for (var _b = __values(this._segments), _c = _b.next(); !_c.done; _c = _b.next()) { for (var _b = __values(this._segments), _c = _b.next(); !_c.done; _c = _b.next()) {
var segment = _c.value; var segment = _c.value;
@@ -15189,12 +15123,12 @@ var es;
segment.p2.begin = !segment.p1.begin; segment.p2.begin = !segment.p1.begin;
} }
} }
catch (e_15_1) { e_15 = { error: e_15_1 }; } catch (e_6_1) { e_6 = { error: e_6_1 }; }
finally { finally {
try { try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b); if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
} }
finally { if (e_15) throw e_15.error; } finally { if (e_6) throw e_6.error; }
} }
// 如果我们有一个聚光灯,我们需要存储前两个段的角度。 // 如果我们有一个聚光灯,我们需要存储前两个段的角度。
// 这些是光斑的边界,我们将用它们来过滤它们之外的任何顶点。 // 这些是光斑的边界,我们将用它们来过滤它们之外的任何顶点。
+1 -1
View File
File diff suppressed because one or more lines are too long
@@ -157,29 +157,33 @@ module es {
// 捞取我们在新的位置上可能会碰撞到的任何东西 // 捞取我们在新的位置上可能会碰撞到的任何东西
let neighbors = Physics.boxcastBroadphaseExcludingSelf(this._collider, this._collider.bounds, this._collider.collidesWithLayers.value); let neighbors = Physics.boxcastBroadphaseExcludingSelf(this._collider, this._collider.bounds, this._collider.collidesWithLayers.value);
for (const neighbor of neighbors) { if (neighbors.length > 0) {
if (!neighbor) for (let i = 0; i < neighbors.length; i ++) {
continue; const neighbor = neighbors[i];
if (!neighbor)
// 如果邻近的对撞机是同一个实体,则忽略它 continue;
if (neighbor.entity.equals(this.entity)) {
continue; // 如果邻近的对撞机是同一个实体,则忽略它
} if (neighbor.entity.equals(this.entity)) {
continue;
if (this._collider.collidesWithNonMotion(neighbor, collisionResult)) { }
// 如果附近有一个ArcadeRigidbody,我们就会处理完整的碰撞响应。如果没有,我们会根据附近是不可移动的来计算事情
let neighborRigidbody = neighbor.entity.getComponent(ArcadeRigidbody); if (this._collider.collidesWithNonMotion(neighbor, collisionResult)) {
if (neighborRigidbody != null) { // 如果附近有一个ArcadeRigidbody,我们就会处理完整的碰撞响应。如果没有,我们会根据附近是不可移动的来计算事情
this.processOverlap(neighborRigidbody, collisionResult.minimumTranslationVector); let neighborRigidbody = neighbor.entity.getComponent(ArcadeRigidbody);
this.processCollision(neighborRigidbody, collisionResult.minimumTranslationVector); if (neighborRigidbody != null) {
} else { this.processOverlap(neighborRigidbody, collisionResult.minimumTranslationVector);
// 没有ArcadeRigidbody,所以我们假设它是不动的,只移动我们自己的 this.processCollision(neighborRigidbody, collisionResult.minimumTranslationVector);
this.entity.position = this.entity.position.sub(collisionResult.minimumTranslationVector); } else {
const relativeVelocity = this.calculateResponseVelocity(this.velocity, collisionResult.minimumTranslationVector); // 没有ArcadeRigidbody,所以我们假设它是不动的,只移动我们自己的
this.velocity.addEqual(relativeVelocity); this.entity.position = this.entity.position.sub(collisionResult.minimumTranslationVector);
const relativeVelocity = this.calculateResponseVelocity(this.velocity, collisionResult.minimumTranslationVector);
this.velocity.addEqual(relativeVelocity);
}
} }
} }
} }
} }
/** /**
@@ -228,23 +228,26 @@ module es {
let neighbors = Physics.boxcastBroadphaseExcludingSelf(this, colliderBounds, this.collidesWithLayers.value); let neighbors = Physics.boxcastBroadphaseExcludingSelf(this, colliderBounds, this.collidesWithLayers.value);
// 更改形状位置,使其处于移动后的位置,以便我们检查是否有重叠 // 更改形状位置,使其处于移动后的位置,以便我们检查是否有重叠
let oldPosition = this.shape.position.clone(); let oldPosition = this.shape.position;
this.shape.position = Vector2.add(this.shape.position, motion); this.shape.position = Vector2.add(this.shape.position, motion);
let didCollide = false; let didCollide = false;
for (let neighbor of neighbors) { if (neighbors.length > 0) {
if (neighbor.isTrigger) for (let i = 0; i < neighbors.length; i ++ ){
continue; const neighbor = neighbors[i];
if (neighbor.isTrigger)
if (this.collidesWithNonMotion(neighbor, result)) { continue;
motion = motion.sub(result.minimumTranslationVector);
this.shape.position = this.shape.position.sub(result.minimumTranslationVector); if (this.collidesWithNonMotion(neighbor, result)) {
didCollide = true; motion = motion.sub(result.minimumTranslationVector);
this.shape.position = this.shape.position.sub(result.minimumTranslationVector);
didCollide = true;
}
} }
} }
// 将形状位置返回到检查之前的位置 // 将形状位置返回到检查之前的位置
this.shape.position = oldPosition.clone(); this.shape.position = oldPosition;
return didCollide; return didCollide;
} }
@@ -23,9 +23,12 @@ module es {
export class TriggerListenerHelper { export class TriggerListenerHelper {
public static getITriggerListener(entity: Entity, components: ITriggerListener[]){ public static getITriggerListener(entity: Entity, components: ITriggerListener[]){
for (let component of entity.components._components) { if (entity.components._components.length > 0) {
if (isITriggerListener(component)) { for (let i = 0; i < entity.components._components.length; i ++) {
components.push(component); const component = entity.components._components[i];
if (isITriggerListener(component)) {
components.push(component);
}
} }
} }
+47 -39
View File
@@ -20,58 +20,66 @@ module es {
*/ */
public calculateMovement(motion: Vector2, collisionResult: CollisionResult): boolean { public calculateMovement(motion: Vector2, collisionResult: CollisionResult): boolean {
let collider = null; let collider = null;
for (let i = 0; i < this.entity.components.buffer.length; i++) { if (this.entity.components.buffer.length > 0)
let component = this.entity.components.buffer[i]; for (let i = 0; i < this.entity.components.buffer.length; i++) {
if (component instanceof Collider) { let component = this.entity.components.buffer[i];
collider = component; if (component instanceof Collider) {
break; collider = component;
break;
}
} }
}
if (collider == null || this._triggerHelper == null) { if (collider == null || this._triggerHelper == null) {
return false; return false;
} }
// 移动所有的非触发碰撞器并获得最近的碰撞 // 移动所有的非触发碰撞器并获得最近的碰撞
let colliders: Collider[] = []; let colliders: Collider[] = [];
for (let i = 0; i < this.entity.components.buffer.length; i ++) { if (this.entity.components.buffer.length > 0)
let component = this.entity.components.buffer[i]; for (let i = 0; i < this.entity.components.buffer.length; i ++) {
if (component instanceof Collider) { let component = this.entity.components.buffer[i];
colliders.push(component); if (component instanceof Collider) {
colliders.push(component);
}
} }
}
for (let i = 0; i < colliders.length; i++) {
let collider = colliders[i];
// 不检测触发器 在我们移动后会重新访问它 if (colliders.length > 0) {
if (collider.isTrigger) for (let i = 0; i < colliders.length; i++) {
continue; let collider = colliders[i];
// 获取我们在新位置可能发生碰撞的任何东西 // 不检测触发器 在我们移动后会重新访问它
let bounds = collider.bounds.clone(); if (collider.isTrigger)
bounds.x += motion.x; continue;
bounds.y += motion.y;
let neighbors = Physics.boxcastBroadphaseExcludingSelf(collider, bounds, collider.collidesWithLayers.value); // 获取我们在新位置可能发生碰撞的任何东西
let bounds = collider.bounds;
for (let neighbor of neighbors) { bounds.x += motion.x;
// 不检测触发器 bounds.y += motion.y;
if (neighbor.isTrigger) let neighbors = Physics.boxcastBroadphaseExcludingSelf(collider, bounds, collider.collidesWithLayers.value);
return;
if (neighbors.length > 0) {
let _internalcollisionResult: CollisionResult = new CollisionResult(); for (let i = 0; i < neighbors.length; i ++) {
if (collider.collidesWith(neighbor, motion, _internalcollisionResult)) { const neighbor = neighbors[i];
// 如果碰撞 则退回之前的移动量 // 不检测触发器
motion.subEqual(_internalcollisionResult.minimumTranslationVector); if (neighbor.isTrigger)
// 如果我们碰到多个对象,为了简单起见,只取第一个。 return;
if (_internalcollisionResult.collider != null) {
collisionResult.collider = _internalcollisionResult.collider; let _internalcollisionResult: CollisionResult = new CollisionResult();
collisionResult.minimumTranslationVector = _internalcollisionResult.minimumTranslationVector; if (collider.collidesWith(neighbor, motion, _internalcollisionResult)) {
collisionResult.normal = _internalcollisionResult.normal; // 如果碰撞 则退回之前的移动量
collisionResult.point = _internalcollisionResult.point; motion.subEqual(_internalcollisionResult.minimumTranslationVector);
// 如果我们碰到多个对象,为了简单起见,只取第一个。
if (_internalcollisionResult.collider != null) {
collisionResult.collider = _internalcollisionResult.collider;
collisionResult.minimumTranslationVector = _internalcollisionResult.minimumTranslationVector;
collisionResult.normal = _internalcollisionResult.normal;
collisionResult.point = _internalcollisionResult.point;
}
}
} }
} }
} }
} }
ListPool.free(Collider, colliders); ListPool.free(Collider, colliders);
return collisionResult.collider != null; return collisionResult.collider != null;
+61 -50
View File
@@ -23,38 +23,44 @@ module es {
// 对所有实体.colliders进行重叠检查,这些实体.colliders是触发器,与所有宽相碰撞器,无论是否触发器。 // 对所有实体.colliders进行重叠检查,这些实体.colliders是触发器,与所有宽相碰撞器,无论是否触发器。
// 任何重叠都会导致触发事件 // 任何重叠都会导致触发事件
let colliders: Collider[] = this.getColliders(); let colliders: Collider[] = this.getColliders();
for (let i = 0; i < colliders.length; i++) { if (colliders.length > 0) {
let collider = colliders[i]; for (let i = 0; i < colliders.length; i++) {
let collider = colliders[i];
let neighbors = Physics.boxcastBroadphaseExcludingSelf(collider, collider.bounds, collider.collidesWithLayers.value);
for (let j = 0; j < neighbors.length; j++) { let neighbors = Physics.boxcastBroadphaseExcludingSelf(collider, collider.bounds, collider.collidesWithLayers.value);
let neighbor = neighbors[j]; for (let j = 0; j < neighbors.length; j++) {
// 我们至少需要一个碰撞器作为触发器 let neighbor = neighbors[j];
if (!collider.isTrigger && !neighbor.isTrigger) // 我们至少需要一个碰撞器作为触发器
continue; if (!collider.isTrigger && !neighbor.isTrigger)
continue;
if (collider.overlaps(neighbor)) {
const pair = new Pair<Collider>(collider, neighbor); if (collider.overlaps(neighbor)) {
const pair = new Pair<Collider>(collider, neighbor);
// 如果我们的某一个集合中已经有了这个对子(前一个或当前的触发交叉点),就不要调用输入事件了
const shouldReportTriggerEvent = !this._activeTriggerIntersections.has(pair) && // 如果我们的某一个集合中已经有了这个对子(前一个或当前的触发交叉点),就不要调用输入事件了
!this._previousTriggerIntersections.has(pair); const shouldReportTriggerEvent = !this._activeTriggerIntersections.has(pair) &&
!this._previousTriggerIntersections.has(pair);
if (shouldReportTriggerEvent) {
if (neighbor.castSortOrder >= Collider.lateSortOrder) { if (shouldReportTriggerEvent) {
lateColliders.push(pair); if (neighbor.castSortOrder >= Collider.lateSortOrder) {
} else { lateColliders.push(pair);
this.notifyTriggerListeners(pair, true); } else {
this.notifyTriggerListeners(pair, true);
}
} }
}
this._activeTriggerIntersections.add(pair);
this._activeTriggerIntersections.add(pair); }
} }
} }
} }
for (const pair of lateColliders) { if (lateColliders.length > 0) {
this.notifyTriggerListeners(pair, true); for (let i = 0; i < lateColliders.length; i ++) {
const pair = lateColliders[i];
this.notifyTriggerListeners(pair, true);
}
} }
this.checkForExitedColliders(); this.checkForExitedColliders();
@@ -62,12 +68,13 @@ module es {
private getColliders() { private getColliders() {
const colliders: Collider[] = []; const colliders: Collider[] = [];
for (let i = 0; i < this._entity.components.buffer.length; i ++) { if (this._entity.components.buffer.length > 0)
const component = this._entity.components.buffer[i]; for (let i = 0; i < this._entity.components.buffer.length; i ++) {
if (component instanceof Collider) { const component = this._entity.components.buffer[i];
colliders.push(component); if (component instanceof Collider) {
colliders.push(component);
}
} }
}
return colliders; return colliders;
} }
@@ -91,28 +98,32 @@ module es {
private notifyTriggerListeners(collisionPair: Pair<Collider>, isEntering: boolean) { private notifyTriggerListeners(collisionPair: Pair<Collider>, isEntering: boolean) {
TriggerListenerHelper.getITriggerListener(collisionPair.first.entity, this._tempTriggerList); TriggerListenerHelper.getITriggerListener(collisionPair.first.entity, this._tempTriggerList);
for (let i = 0; i < this._tempTriggerList.length; i++) { if (this._tempTriggerList.length > 0)
if (isEntering) { for (let i = 0; i < this._tempTriggerList.length; i++) {
this._tempTriggerList[i].onTriggerEnter(collisionPair.second, collisionPair.first); const trigger = this._tempTriggerList[i];
} else { if (isEntering) {
this._tempTriggerList[i].onTriggerExit(collisionPair.second, collisionPair.first); trigger.onTriggerEnter(collisionPair.second, collisionPair.first);
} } else {
trigger.onTriggerExit(collisionPair.second, collisionPair.first);
this._tempTriggerList.length = 0;
if (collisionPair.second.entity) {
TriggerListenerHelper.getITriggerListener(collisionPair.second.entity, this._tempTriggerList);
for (let i = 0; i < this._tempTriggerList.length; i++) {
if (isEntering) {
this._tempTriggerList[i].onTriggerEnter(collisionPair.first, collisionPair.second);
} else {
this._tempTriggerList[i].onTriggerExit(collisionPair.first, collisionPair.second);
}
} }
this._tempTriggerList.length = 0; this._tempTriggerList.length = 0;
if (collisionPair.second.entity) {
TriggerListenerHelper.getITriggerListener(collisionPair.second.entity, this._tempTriggerList);
if (this._tempTriggerList.length > 0)
for (let i = 0; i < this._tempTriggerList.length; i++) {
const trigger = this._tempTriggerList[i];
if (isEntering) {
trigger.onTriggerEnter(collisionPair.first, collisionPair.second);
} else {
trigger.onTriggerExit(collisionPair.first, collisionPair.second);
}
}
this._tempTriggerList.length = 0;
}
} }
}
} }
} }
} }
+19 -15
View File
@@ -113,15 +113,17 @@ module es {
continue; continue;
// 当cell不为空。循环并取回所有碰撞器 // 当cell不为空。循环并取回所有碰撞器
for (let i = 0; i < cell.length; i++) { if (cell.length > 0) {
const collider = cell[i]; for (let i = 0; i < cell.length; i++) {
const collider = cell[i];
// 如果它是自身或者如果它不匹配我们的层掩码 跳过这个碰撞器
if (collider == excludeCollider || !Flags.isFlagSet(layerMask, collider.physicsLayer.value)) // 如果它是自身或者如果它不匹配我们的层掩码 跳过这个碰撞器
continue; if (collider == excludeCollider || !Flags.isFlagSet(layerMask, collider.physicsLayer.value))
continue;
if (bounds.intersects(collider.bounds)) {
this._tempHashSet.add(collider); if (bounds.intersects(collider.bounds)) {
this._tempHashSet.add(collider);
}
} }
} }
} }
@@ -215,7 +217,9 @@ module es {
let resultCounter = 0; let resultCounter = 0;
let potentials = this.aabbBroadphase(rect, null, layerMask); let potentials = this.aabbBroadphase(rect, null, layerMask);
for (let collider of potentials) {
for (let i = 0; i < potentials.length; i ++) {
const collider = potentials[i];
if (collider instanceof BoxCollider) { if (collider instanceof BoxCollider) {
results[resultCounter] = collider; results[resultCounter] = collider;
resultCounter++; resultCounter++;
@@ -255,7 +259,8 @@ module es {
let resultCounter = 0; let resultCounter = 0;
const potentials = this.aabbBroadphase(bounds, null, layerMask); const potentials = this.aabbBroadphase(bounds, null, layerMask);
for (let collider of potentials) { for (let i = 0; i < potentials.length; i ++) {
const collider = potentials[i];
if (collider instanceof BoxCollider) { if (collider instanceof BoxCollider) {
if (collider.shape.overlaps(this._overlapTestCircle)) { if (collider.shape.overlaps(this._overlapTestCircle)) {
results[resultCounter] = collider; results[resultCounter] = collider;
@@ -324,9 +329,8 @@ module es {
*/ */
public remove(obj: T) { public remove(obj: T) {
this._store.forEach(list => { this._store.forEach(list => {
let linqList = new es.List(list); let index = list.indexOf(obj);
if (linqList.contains(obj)) list.splice(index, 1);
linqList.remove(obj);
}) })
} }
@@ -383,7 +387,7 @@ module es {
const potential = cell[i]; const potential = cell[i];
// 管理我们已经处理过的碰撞器 // 管理我们已经处理过的碰撞器
if (new es.List(this._checkedColliders).contains(potential)) if (this._checkedColliders.indexOf(potential) != -1)
continue; continue;
this._checkedColliders.push(potential); this._checkedColliders.push(potential);
+10 -4
View File
@@ -31,14 +31,20 @@ module es {
public union(other: PairSet<T>) { public union(other: PairSet<T>) {
const otherAll = other.all; const otherAll = other.all;
for (const elem of otherAll) {
this.add(elem); if (otherAll.length > 0)
} for (let i = 0; i < otherAll.length; i ++) {
const elem = otherAll[i];
this.add(elem);
}
} }
public except(other: PairSet<T>) { public except(other: PairSet<T>) {
const otherAll = other.all; const otherAll = other.all;
for (const elem of otherAll) {
if (otherAll.length > 0)
for (let i = 0; i < otherAll.length; i ++) {
const elem = otherAll[i];
this.remove(elem); this.remove(elem);
} }
} }