mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-07 20:31:51 +09:00
no message
This commit is contained in:
@@ -55,8 +55,8 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
|
||||
|
||||
val tilewiseHitbox: Hitbox
|
||||
get() = Hitbox.fromTwoPoints(
|
||||
hitbox.posX.div(TILE_SIZE).floor(),
|
||||
hitbox.posY.div(TILE_SIZE).floor(),
|
||||
hitbox.startX.div(TILE_SIZE).floor(),
|
||||
hitbox.startY.div(TILE_SIZE).floor(),
|
||||
hitbox.endX.div(TILE_SIZE).floor(),
|
||||
hitbox.endY.div(TILE_SIZE).floor()
|
||||
)
|
||||
@@ -157,9 +157,10 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
|
||||
* Flags and Properties
|
||||
*/
|
||||
|
||||
|
||||
val grounded: Boolean
|
||||
get() = isPlayerNoClip || isTouchingSide(hitbox, COLLIDING_BOTTOM)
|
||||
get() = isPlayerNoClip ||
|
||||
(world.gravitation.y > 0 && isTouchingSide(hitbox, COLLIDING_BOTTOM) ||
|
||||
world.gravitation.y < 0 && isTouchingSide(hitbox, COLLIDING_TOP))
|
||||
/** Default to 'true' */
|
||||
var isVisible = true
|
||||
/** Default to 'true' */
|
||||
@@ -716,22 +717,17 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
|
||||
// apply Normal Force
|
||||
// next step (resolve controllerMoveDelta) requires this to be pre-handled
|
||||
if (isTouchingSide(simulationHitbox, COLLIDING_BOTTOM)) {
|
||||
//if (gravitation.y > 0.0) grounded = true
|
||||
// reset walkY
|
||||
walkY *= elasticity
|
||||
externalForce.y *= elasticity
|
||||
debug1("!! grounded ${Random().nextInt(1000)}!!")
|
||||
}
|
||||
else if (isTouchingSide(simulationHitbox, COLLIDING_TOP)) {
|
||||
//if (gravitation.y < 0.0) grounded = true
|
||||
// reset walkY
|
||||
walkY *= elasticity
|
||||
externalForce.y *= elasticity
|
||||
debug1("!! headbutt ${Random().nextInt(1000)}!!")
|
||||
}
|
||||
|
||||
if (isTouchingSide(simulationHitbox, COLLIDING_LR)) {
|
||||
// reset walkX
|
||||
//walkX *= elasticity
|
||||
externalForce.x *= elasticity
|
||||
debug1("!! tackle ${Random().nextInt(1000)}!!")
|
||||
@@ -783,8 +779,8 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
|
||||
}
|
||||
|
||||
|
||||
if (isTouchingSide(simulationHitboxX, COLLIDING_LEFT) || isTouchingSide(simulationHitboxX, COLLIDING_RIGHT)) {
|
||||
controllerMoveDelta!!.x *= elasticity
|
||||
if (isTouchingSide(simulationHitboxX, COLLIDING_LR)) {
|
||||
//controllerMoveDelta!!.x *= elasticity // FIXME commented: "brake" applied when climbing down several steps
|
||||
}
|
||||
}
|
||||
|
||||
@@ -811,7 +807,7 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
|
||||
|
||||
// set new mid
|
||||
// TODO UD-touching or colliding?
|
||||
if (isTouchingSide(simulationHitboxY, COLLIDING_TOP) || isTouchingSide(simulationHitboxY, COLLIDING_BOTTOM)) {
|
||||
if (isTouchingSide(simulationHitboxY, COLLIDING_UD)) {
|
||||
debug3("y bmid = $bmid, new endY: ${simulationHitboxY.endY}, going back")
|
||||
high = bmid
|
||||
}
|
||||
@@ -828,7 +824,7 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
|
||||
}
|
||||
|
||||
|
||||
simulationHitbox.setPosition(simulationHitboxX.posX, simulationHitboxY.posY)
|
||||
simulationHitbox.setPosition(simulationHitboxX.startX, simulationHitboxY.startY)
|
||||
|
||||
debug3("== END ControllerMoveDelta ==")
|
||||
}
|
||||
@@ -974,9 +970,9 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
|
||||
if (isNoCollideWorld) return false
|
||||
|
||||
// detectors are inside of the bounding box
|
||||
val x1 = hitbox.posX
|
||||
val x1 = hitbox.startX
|
||||
val x2 = hitbox.endX - A_PIXEL
|
||||
val y1 = hitbox.posY
|
||||
val y1 = hitbox.startY
|
||||
val y2 = hitbox.endY - A_PIXEL
|
||||
|
||||
|
||||
@@ -1009,40 +1005,39 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
|
||||
|
||||
// detectors are inside of the bounding box
|
||||
if (option == COLLIDING_TOP) {
|
||||
x1 = hitbox.posX
|
||||
x1 = hitbox.startX
|
||||
x2 = hitbox.endX - A_PIXEL
|
||||
y1 = hitbox.posY - A_PIXEL - A_PIXEL
|
||||
y1 = hitbox.startY - A_PIXEL - A_PIXEL
|
||||
y2 = y1
|
||||
}
|
||||
else if (option == COLLIDING_BOTTOM) {
|
||||
x1 = hitbox.posX
|
||||
x1 = hitbox.startX
|
||||
x2 = hitbox.endX - A_PIXEL
|
||||
y1 = hitbox.endY
|
||||
y2 = y1
|
||||
}
|
||||
else if (option == COLLIDING_LEFT) {
|
||||
x1 = hitbox.posX - A_PIXEL
|
||||
x1 = hitbox.startX - A_PIXEL
|
||||
x2 = x1
|
||||
y1 = hitbox.posY
|
||||
y1 = hitbox.startY
|
||||
y2 = hitbox.endY - A_PIXEL
|
||||
}
|
||||
else if (option == COLLIDING_RIGHT) {
|
||||
x1 = hitbox.endX
|
||||
x2 = x1
|
||||
y1 = hitbox.posY
|
||||
y1 = hitbox.startY
|
||||
y2 = hitbox.endY - A_PIXEL
|
||||
}
|
||||
else if (option == COLLIDING_ALLSIDE) {
|
||||
x1 = hitbox.posX - A_PIXEL
|
||||
x2 = hitbox.endX
|
||||
y1 = hitbox.posY - A_PIXEL
|
||||
y2 = hitbox.endY
|
||||
return isTouchingSide(hitbox, COLLIDING_LEFT) || isTouchingSide(hitbox, COLLIDING_RIGHT) ||
|
||||
isTouchingSide(hitbox, COLLIDING_BOTTOM) || isTouchingSide(hitbox, COLLIDING_TOP)
|
||||
|
||||
}
|
||||
else if (option == COLLIDING_LR) {
|
||||
x1 = hitbox.posX - A_PIXEL
|
||||
x2 = hitbox.endX
|
||||
y1 = hitbox.posY
|
||||
y2 = hitbox.endY - A_PIXEL
|
||||
return isTouchingSide(hitbox, COLLIDING_LEFT) || isTouchingSide(hitbox, COLLIDING_RIGHT)
|
||||
}
|
||||
else if (option == COLLIDING_UD) {
|
||||
return isTouchingSide(hitbox, COLLIDING_BOTTOM) || isTouchingSide(hitbox, COLLIDING_TOP)
|
||||
}
|
||||
else throw IllegalArgumentException()
|
||||
|
||||
@@ -1340,23 +1335,23 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
|
||||
if (WorldCamera.xCentre > leftsidePadding && centrePosPoint.x <= rightsidePadding) {
|
||||
// camera center neg, actor center pos
|
||||
spriteGlow!!.render(g,
|
||||
(hitbox.posX - offsetX).toFloat() + world.width * TILE_SIZE,
|
||||
(hitbox.posY - offsetY).toFloat(),
|
||||
(hitbox.startX - offsetX).toFloat() + world.width * TILE_SIZE,
|
||||
(hitbox.startY - offsetY).toFloat(),
|
||||
(scale).toFloat()
|
||||
)
|
||||
}
|
||||
else if (WorldCamera.xCentre < rightsidePadding && centrePosPoint.x >= leftsidePadding) {
|
||||
// camera center pos, actor center neg
|
||||
spriteGlow!!.render(g,
|
||||
(hitbox.posX - offsetX).toFloat() - world.width * TILE_SIZE,
|
||||
(hitbox.posY - offsetY).toFloat(),
|
||||
(hitbox.startX - offsetX).toFloat() - world.width * TILE_SIZE,
|
||||
(hitbox.startY - offsetY).toFloat(),
|
||||
(scale).toFloat()
|
||||
)
|
||||
}
|
||||
else {
|
||||
spriteGlow!!.render(g,
|
||||
(hitbox.posX - offsetX).toFloat(),
|
||||
(hitbox.posY - offsetY).toFloat(),
|
||||
(hitbox.startX - offsetX).toFloat(),
|
||||
(hitbox.startY - offsetY).toFloat(),
|
||||
(scale).toFloat()
|
||||
)
|
||||
}
|
||||
@@ -1381,23 +1376,23 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
|
||||
if (WorldCamera.xCentre > leftsidePadding && centrePosPoint.x <= rightsidePadding) {
|
||||
// camera center neg, actor center pos
|
||||
sprite!!.render(g,
|
||||
(hitbox.posX - offsetX).toFloat() + world.width * TILE_SIZE,
|
||||
(hitbox.posY - offsetY).toFloat(),
|
||||
(hitbox.startX - offsetX).toFloat() + world.width * TILE_SIZE,
|
||||
(hitbox.startY - offsetY).toFloat(),
|
||||
(scale).toFloat()
|
||||
)
|
||||
}
|
||||
else if (WorldCamera.xCentre < rightsidePadding && centrePosPoint.x >= leftsidePadding) {
|
||||
// camera center pos, actor center neg
|
||||
sprite!!.render(g,
|
||||
(hitbox.posX - offsetX).toFloat() - world.width * TILE_SIZE,
|
||||
(hitbox.posY - offsetY).toFloat(),
|
||||
(hitbox.startX - offsetX).toFloat() - world.width * TILE_SIZE,
|
||||
(hitbox.startY - offsetY).toFloat(),
|
||||
(scale).toFloat()
|
||||
)
|
||||
}
|
||||
else {
|
||||
sprite!!.render(g,
|
||||
(hitbox.posX - offsetX).toFloat(),
|
||||
(hitbox.posY - offsetY).toFloat(),
|
||||
(hitbox.startX - offsetX).toFloat(),
|
||||
(hitbox.startY - offsetY).toFloat(),
|
||||
(scale).toFloat()
|
||||
)
|
||||
}
|
||||
@@ -1467,8 +1462,8 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
|
||||
|
||||
private fun forEachOccupyingTileNum(consumer: (Int?) -> Unit) {
|
||||
val tiles = ArrayList<Int?>()
|
||||
for (y in tilewiseHitbox.posY.toInt()..tilewiseHitbox.endY.toInt()) {
|
||||
for (x in tilewiseHitbox.posX.toInt()..tilewiseHitbox.endX.toInt()) {
|
||||
for (y in tilewiseHitbox.startY.toInt()..tilewiseHitbox.endY.toInt()) {
|
||||
for (x in tilewiseHitbox.startX.toInt()..tilewiseHitbox.endX.toInt()) {
|
||||
tiles.add(world.getTileFromTerrain(x, y))
|
||||
}
|
||||
}
|
||||
@@ -1478,8 +1473,8 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
|
||||
|
||||
private fun forEachOccupyingTile(consumer: (BlockProp?) -> Unit) {
|
||||
val tileProps = ArrayList<BlockProp?>()
|
||||
for (y in tilewiseHitbox.posY.toInt()..tilewiseHitbox.endY.toInt()) {
|
||||
for (x in tilewiseHitbox.posX.toInt()..tilewiseHitbox.endX.toInt()) {
|
||||
for (y in tilewiseHitbox.startY.toInt()..tilewiseHitbox.endY.toInt()) {
|
||||
for (x in tilewiseHitbox.startX.toInt()..tilewiseHitbox.endX.toInt()) {
|
||||
tileProps.add(BlockCodex[world.getTileFromTerrain(x, y)])
|
||||
}
|
||||
}
|
||||
@@ -1493,7 +1488,7 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
|
||||
// offset 1 pixel to the down so that friction would work
|
||||
val y = hitbox.endY.plus(1.0).div(TILE_SIZE).floorInt()
|
||||
|
||||
for (x in tilewiseHitbox.posX.toInt()..tilewiseHitbox.endX.toInt()) {
|
||||
for (x in tilewiseHitbox.startX.toInt()..tilewiseHitbox.endX.toInt()) {
|
||||
tiles.add(world.getTileFromTerrain(x, y))
|
||||
}
|
||||
|
||||
@@ -1506,7 +1501,7 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
|
||||
// offset 1 pixel to the down so that friction would work
|
||||
val y = hitbox.endY.plus(1.0).div(TILE_SIZE).floorInt()
|
||||
|
||||
for (x in tilewiseHitbox.posX.toInt()..tilewiseHitbox.endX.toInt()) {
|
||||
for (x in tilewiseHitbox.startX.toInt()..tilewiseHitbox.endX.toInt()) {
|
||||
tileProps.add(BlockCodex[world.getTileFromTerrain(x, y)])
|
||||
}
|
||||
|
||||
|
||||
@@ -64,9 +64,9 @@ class Hitbox(x1: Double, y1: Double, width: Double, height: Double) {
|
||||
fun setFromTwoPoints(x1: Double, y1: Double, x2: Double, y2: Double): Hitbox {
|
||||
return setFromWidthHeight(x1, y1, x2 - x1, y2 - y1)
|
||||
}
|
||||
fun reassign(other: Hitbox) = setFromTwoPoints(other.posX, other.posY, other.endX, other.endY)
|
||||
fun reassign(other: Hitbox) = setFromTwoPoints(other.startX, other.startY, other.endX, other.endY)
|
||||
|
||||
fun translate(x: Double, y: Double) = setPosition(posX + x, posY + y)
|
||||
fun translate(x: Double, y: Double) = setPosition(startX + x, startY + y)
|
||||
fun translate(vec: Vector2?) = if (vec != null) translate(vec.x, vec.y) else this
|
||||
|
||||
fun setPosition(x1: Double, y1: Double): Hitbox {
|
||||
@@ -75,8 +75,8 @@ class Hitbox(x1: Double, y1: Double, width: Double, height: Double) {
|
||||
}
|
||||
fun setPosition(vector: Vector2) = setPosition(vector.x, vector.y)
|
||||
|
||||
fun setPositionX(x: Double) = setPosition(x, posY)
|
||||
fun setPositionY(y: Double) = setPosition(posX, y)
|
||||
fun setPositionX(x: Double) = setPosition(x, startY)
|
||||
fun setPositionY(y: Double) = setPosition(startX, y)
|
||||
|
||||
fun setPositionFromPointed(x1: Double, y1: Double): Hitbox {
|
||||
hitboxStart = Point2d(x1 - width / 2, y1 - height)
|
||||
@@ -84,12 +84,12 @@ class Hitbox(x1: Double, y1: Double, width: Double, height: Double) {
|
||||
}
|
||||
|
||||
fun translatePosX(d: Double): Hitbox {
|
||||
setPositionX(posX + d)
|
||||
setPositionX(startX + d)
|
||||
return this
|
||||
}
|
||||
|
||||
fun translatePosY(d: Double): Hitbox {
|
||||
setPositionY(posY + d)
|
||||
setPositionY(startY + d)
|
||||
return this
|
||||
}
|
||||
|
||||
@@ -101,16 +101,16 @@ class Hitbox(x1: Double, y1: Double, width: Double, height: Double) {
|
||||
|
||||
/**
|
||||
* Returns x value of start point
|
||||
* @return top-left point posX
|
||||
* @return top-left point startX
|
||||
*/
|
||||
val posX: Double
|
||||
val startX: Double
|
||||
get() = hitboxStart.x
|
||||
|
||||
/**
|
||||
* Returns y value of start point
|
||||
* @return top-left point posY
|
||||
* @return top-left point startY
|
||||
*/
|
||||
val posY: Double
|
||||
val startY: Double
|
||||
get() = hitboxStart.y
|
||||
|
||||
val centeredX: Double
|
||||
@@ -120,12 +120,12 @@ class Hitbox(x1: Double, y1: Double, width: Double, height: Double) {
|
||||
get() = (hitboxStart.y + hitboxEnd.y) * 0.5
|
||||
|
||||
fun intersects(position: Point2d) =
|
||||
(position.x >= posX && position.x <= posX + width) &&
|
||||
(position.y >= posY && position.y <= posY + height)
|
||||
(position.x >= startX && position.x <= startX + width) &&
|
||||
(position.y >= startY && position.y <= startY + height)
|
||||
|
||||
fun toVector(): Vector2 = Vector2(posX, posY)
|
||||
fun toVector(): Vector2 = Vector2(startX, startY)
|
||||
|
||||
fun clone(): Hitbox = Hitbox(posX, posY, width, height)
|
||||
fun clone(): Hitbox = Hitbox(startX, startY, width, height)
|
||||
|
||||
companion object {
|
||||
fun fromTwoPoints(x1: Double, y1: Double, x2: Double, y2: Double) =
|
||||
|
||||
Reference in New Issue
Block a user