新增Out类
This commit is contained in:
@@ -153,8 +153,6 @@ module es {
|
||||
this.velocity.addEqual(Physics.gravity.scale(Time.deltaTime));
|
||||
this.entity.position = this.entity.position.add(this.velocity.scale(Time.deltaTime));
|
||||
|
||||
let collisionResult = new CollisionResult();
|
||||
|
||||
// 捞取我们在新的位置上可能会碰撞到的任何东西
|
||||
let neighbors = Physics.boxcastBroadphaseExcludingSelf(this._collider, this._collider.bounds, this._collider.collidesWithLayers.value);
|
||||
if (neighbors.length > 0) {
|
||||
@@ -168,16 +166,17 @@ module es {
|
||||
continue;
|
||||
}
|
||||
|
||||
const collisionResult = new Out<CollisionResult>();
|
||||
if (this._collider.collidesWithNonMotion(neighbor, collisionResult)) {
|
||||
// 如果附近有一个ArcadeRigidbody,我们就会处理完整的碰撞响应。如果没有,我们会根据附近是不可移动的来计算事情
|
||||
let neighborRigidbody = neighbor.entity.getComponent(ArcadeRigidbody);
|
||||
if (neighborRigidbody != null) {
|
||||
this.processOverlap(neighborRigidbody, collisionResult.minimumTranslationVector);
|
||||
this.processCollision(neighborRigidbody, collisionResult.minimumTranslationVector);
|
||||
this.processOverlap(neighborRigidbody, collisionResult.value.minimumTranslationVector);
|
||||
this.processCollision(neighborRigidbody, collisionResult.value.minimumTranslationVector);
|
||||
} else {
|
||||
// 没有ArcadeRigidbody,所以我们假设它是不动的,只移动我们自己的
|
||||
this.entity.position = this.entity.position.sub(collisionResult.minimumTranslationVector);
|
||||
const relativeVelocity = this.calculateResponseVelocity(this.velocity, collisionResult.minimumTranslationVector);
|
||||
this.entity.position = this.entity.position.sub(collisionResult.value.minimumTranslationVector);
|
||||
const relativeVelocity = this.calculateResponseVelocity(this.velocity, collisionResult.value.minimumTranslationVector);
|
||||
this.velocity.addEqual(relativeVelocity);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -184,14 +184,14 @@ module es {
|
||||
* @param motion
|
||||
* @param result
|
||||
*/
|
||||
public collidesWith(collider: Collider, motion: Vector2, result: CollisionResult = new CollisionResult()): boolean {
|
||||
public collidesWith(collider: Collider, motion: Vector2, result: Out<CollisionResult>): boolean {
|
||||
// 改变形状的位置,使它在移动后的位置,这样我们可以检查重叠
|
||||
const oldPosition = this.entity.position;
|
||||
this.entity.position = this.entity.position.add(motion);
|
||||
|
||||
const didCollide = this.shape.collidesWithShape(collider.shape, result);
|
||||
if (didCollide)
|
||||
result.collider = collider;
|
||||
result.value.collider = collider;
|
||||
|
||||
// 将图形位置返回到检查前的位置
|
||||
this.entity.position = oldPosition;
|
||||
@@ -204,13 +204,13 @@ module es {
|
||||
* @param collider
|
||||
* @param result
|
||||
*/
|
||||
public collidesWithNonMotion(collider: Collider, result: CollisionResult = new CollisionResult()): boolean {
|
||||
public collidesWithNonMotion(collider: Collider, result: Out<CollisionResult>): boolean {
|
||||
if (this.shape.collidesWithShape(collider.shape, result)) {
|
||||
result.collider = collider;
|
||||
result.value.collider = collider;
|
||||
return true;
|
||||
}
|
||||
|
||||
result.collider = null;
|
||||
result.value.collider = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -220,7 +220,9 @@ module es {
|
||||
* @param motion
|
||||
* @param result
|
||||
*/
|
||||
public collidesWithAny(motion: Vector2, result: CollisionResult) {
|
||||
public collidesWithAny(motion: Vector2, result: Out<CollisionResult>) {
|
||||
result.value = new CollisionResult();
|
||||
|
||||
// 在我们的新位置上获取我们可能会碰到的任何东西
|
||||
let colliderBounds = this.bounds.clone();
|
||||
colliderBounds.x += motion.x;
|
||||
@@ -232,17 +234,15 @@ module es {
|
||||
this.shape.position = Vector2.add(this.shape.position, motion);
|
||||
|
||||
let didCollide = false;
|
||||
if (neighbors.length > 0) {
|
||||
for (let i = 0; i < neighbors.length; i ++ ){
|
||||
const neighbor = neighbors[i];
|
||||
if (neighbor.isTrigger)
|
||||
continue;
|
||||
|
||||
if (this.collidesWithNonMotion(neighbor, result)) {
|
||||
motion = motion.sub(result.minimumTranslationVector);
|
||||
this.shape.position = this.shape.position.sub(result.minimumTranslationVector);
|
||||
didCollide = true;
|
||||
}
|
||||
for (let i = 0; i < neighbors.length; i ++ ){
|
||||
const neighbor = neighbors[i];
|
||||
if (neighbor.isTrigger)
|
||||
continue;
|
||||
|
||||
if (this.collidesWithNonMotion(neighbor, result)) {
|
||||
motion = motion.sub(result.value.minimumTranslationVector);
|
||||
this.shape.position = this.shape.position.sub(result.value.minimumTranslationVector);
|
||||
didCollide = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -256,7 +256,8 @@ module es {
|
||||
* 检查此碰撞器是否与场景中的其他碰撞器碰撞。它相交的第一个碰撞器将在碰撞结果中返回碰撞数据。
|
||||
* @param result
|
||||
*/
|
||||
public collidesWithAnyNonMotion(result: CollisionResult = new CollisionResult()) {
|
||||
public collidesWithAnyNonMotion(result: Out<CollisionResult>) {
|
||||
result.value = new CollisionResult();
|
||||
// 在我们的新位置上获取我们可能会碰到的任何东西
|
||||
let neighbors = Physics.boxcastBroadphaseExcludingSelfNonRect(this, this.collidesWithLayers.value);
|
||||
|
||||
|
||||
@@ -18,7 +18,9 @@ module es {
|
||||
* @param motion
|
||||
* @param collisionResult
|
||||
*/
|
||||
public calculateMovement(motion: Vector2, collisionResult: CollisionResult): boolean {
|
||||
public calculateMovement(motion: Vector2, collisionResult: Out<CollisionResult>): boolean {
|
||||
collisionResult.value = new CollisionResult();
|
||||
|
||||
let collider = null;
|
||||
if (this.entity.components.buffer.length > 0)
|
||||
for (let i = 0; i < this.entity.components.buffer.length; i++) {
|
||||
@@ -65,16 +67,16 @@ module es {
|
||||
if (neighbor.isTrigger)
|
||||
return;
|
||||
|
||||
let _internalcollisionResult: CollisionResult = new CollisionResult();
|
||||
let _internalcollisionResult = new Out<CollisionResult>();
|
||||
if (collider.collidesWith(neighbor, motion, _internalcollisionResult)) {
|
||||
// 如果碰撞 则退回之前的移动量
|
||||
motion.subEqual(_internalcollisionResult.minimumTranslationVector);
|
||||
motion.subEqual(_internalcollisionResult.value.minimumTranslationVector);
|
||||
// 如果我们碰到多个对象,为了简单起见,只取第一个。
|
||||
if (_internalcollisionResult.collider != null) {
|
||||
collisionResult.collider = _internalcollisionResult.collider;
|
||||
collisionResult.minimumTranslationVector = _internalcollisionResult.minimumTranslationVector;
|
||||
collisionResult.normal = _internalcollisionResult.normal;
|
||||
collisionResult.point = _internalcollisionResult.point;
|
||||
if (_internalcollisionResult.value.collider != null) {
|
||||
collisionResult.value.collider = _internalcollisionResult.value.collider;
|
||||
collisionResult.value.minimumTranslationVector = _internalcollisionResult.value.minimumTranslationVector;
|
||||
collisionResult.value.normal = _internalcollisionResult.value.normal;
|
||||
collisionResult.value.point = _internalcollisionResult.value.point;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -83,7 +85,7 @@ module es {
|
||||
}
|
||||
ListPool.free(Collider, colliders);
|
||||
|
||||
return collisionResult.collider != null;
|
||||
return collisionResult.value.collider != null;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -104,10 +106,10 @@ module es {
|
||||
* @param motion
|
||||
* @param collisionResult
|
||||
*/
|
||||
public move(motion: Vector2, collisionResult: CollisionResult) {
|
||||
public move(motion: Vector2, collisionResult: Out<CollisionResult>) {
|
||||
this.calculateMovement(motion, collisionResult);
|
||||
this.applyMovement(motion);
|
||||
return collisionResult.collider != null;
|
||||
return collisionResult.value.collider != null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ module es {
|
||||
*/
|
||||
public static checkEvery(interval: number) {
|
||||
// 我们减去了delta,因为timeSinceSceneLoad已经包含了这个update ticks delta
|
||||
return this.timeSinceSceneLoad / interval > (this.timeSinceSceneLoad - this.deltaTime) / interval;
|
||||
return MathHelper.toInt(this.timeSinceSceneLoad / interval) > MathHelper.toInt((this.timeSinceSceneLoad - this.deltaTime) / interval);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user