still sketchy, but at least I can only care about corner cases, as it's not generalised

This commit is contained in:
minjaesong
2017-06-01 16:58:25 +09:00
parent 3dae7b9d45
commit f95cc5b27d

View File

@@ -585,7 +585,7 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
// ignore MOST of the codes below (it might be possible to recycle the structure??)
val sixteenStep = (0..ccdSteps).map { hitbox.clone().translate(vectorSum * (it / ccdSteps.toDouble())) } // zeroth step is unused
val sixteenStep = (0..ccdSteps).map { hitbox.clone().translate(vectorSum * (it / ccdSteps.toDouble())) } // zeroth step is for special condition
val affectingTiles = ArrayList<BlockAddress>()
var collidingStep: Int? = null
@@ -630,16 +630,48 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
when (selfCollisionStatus) {
0 -> { println("[ActorWithPhysics] Contradiction -- collision detected by CCD, but isWalled() says otherwise") }
5 -> { bounceX = true }
10 -> { bounceY = true }
15 -> { newHitbox.reassign(sixteenStep[0]); bounceX = true; bounceY = true }
// one-side collision
1, 11 -> { newHitbox.translatePosX(TILE_SIZE - newHitbox.startX.modTileDelta ()) }
4, 14 -> { newHitbox.translatePosX( - newHitbox.endX.modTileDelta ()) }
8, 13 -> { newHitbox.translatePosY(TILE_SIZE - newHitbox.startY.modTileDelta ()) }
2, 7 -> { newHitbox.translatePosY( - newHitbox.endY.modTileDelta ()) }
1, 11 -> { newHitbox.translatePosX(TILE_SIZE - newHitbox.startX.modTileDelta ()); bounceX = true }
4, 14 -> { newHitbox.translatePosX( - newHitbox.endX.modTileDelta ()) ; bounceX = true }
8, 13 -> { newHitbox.translatePosY(TILE_SIZE - newHitbox.startY.modTileDelta ()); bounceY = true }
2, 7 -> { newHitbox.translatePosY( - newHitbox.endY.modTileDelta ()) ; bounceY = true }
// two-side collision
3 -> {
newHitbox.translatePosX(TILE_SIZE - newHitbox.startX.modTileDelta ())
newHitbox.translatePosY( - newHitbox.endY.modTileDelta ())
bounceX = true; bounceY = true
}
6 -> {
newHitbox.translatePosX( - newHitbox.endX.modTileDelta ())
newHitbox.translatePosY( - newHitbox.endY.modTileDelta ())
bounceX = true; bounceY = true
}
9 -> {
newHitbox.translatePosX(TILE_SIZE - newHitbox.startX.modTileDelta ())
newHitbox.translatePosY(TILE_SIZE - newHitbox.startY.modTileDelta ())
bounceX = true; bounceY = true
}
12 -> {
newHitbox.translatePosX( - newHitbox.endX.modTileDelta ())
newHitbox.translatePosY(TILE_SIZE - newHitbox.startY.modTileDelta ())
bounceX = true; bounceY = true
}
}
// bounce X/Y
if (bounceX) {
externalForce.x *= elasticity
controllerMoveDelta?.let { controllerMoveDelta!!.x *= elasticity }
}
if (bounceY) {
externalForce.y *= elasticity
controllerMoveDelta?.let { controllerMoveDelta!!.y *= elasticity }
}
hitbox.reassign(newHitbox)