finally fixing contradictory key press handling (left+right, up+down)

This commit is contained in:
minjaesong
2026-02-13 19:52:14 +09:00
parent 4d9252dd80
commit 93c5822c7b

View File

@@ -175,6 +175,10 @@ open class ActorHumanoid : ActorWithBody, Controllable, Pocketed, Factionable, L
@Transient private var prevHMoveKey = KEY_NULL @Transient private var prevHMoveKey = KEY_NULL
@Transient private var prevVMoveKey = KEY_NULL @Transient private var prevVMoveKey = KEY_NULL
@Transient private var wasLeftDown = false
@Transient private var wasRightDown = false
@Transient private var wasUpDown = false
@Transient private var wasDownDown = false
@Transient private val AXIS_KEYBOARD = -13372f // leetz @Transient private val AXIS_KEYBOARD = -13372f // leetz
@@ -271,6 +275,15 @@ open class ActorHumanoid : ActorWithBody, Controllable, Pocketed, Factionable, L
isRightDown = Gdx.input.isKeyPressed(ControlPresets.getKey("control_key_right")) isRightDown = Gdx.input.isKeyPressed(ControlPresets.getKey("control_key_right"))
isJumpDown = Gdx.input.isKeyPressed(ControlPresets.getKey("control_key_jump")) isJumpDown = Gdx.input.isKeyPressed(ControlPresets.getKey("control_key_jump"))
if (isLeftDown && !wasLeftDown)
prevHMoveKey = ControlPresets.getKey("control_key_left")
if (isRightDown && !wasRightDown)
prevHMoveKey = ControlPresets.getKey("control_key_right")
if (isUpDown && !wasUpDown)
prevVMoveKey = ControlPresets.getKey("control_key_up")
if (isDownDown && !wasDownDown)
prevVMoveKey = ControlPresets.getKey("control_key_down")
val gamepad = App.gamepad val gamepad = App.gamepad
if (gamepad != null) { if (gamepad != null) {
@@ -311,6 +324,11 @@ open class ActorHumanoid : ActorWithBody, Controllable, Pocketed, Factionable, L
} }
// TODO just disable "snap to ground" on collision solver if {player's body overlaps with the platform/downDownVirtually}? // TODO just disable "snap to ground" on collision solver if {player's body overlaps with the platform/downDownVirtually}?
// the point is: disable snap (or don't consider offending tiles as solid) for certain Y-pos only, tiles on Y+1 are still solid // the point is: disable snap (or don't consider offending tiles as solid) for certain Y-pos only, tiles on Y+1 are still solid
wasLeftDown = isLeftDown
wasRightDown = isRightDown
wasUpDown = isUpDown
wasDownDown = isDownDown
} }
private inline val hasController: Boolean private inline val hasController: Boolean
@@ -359,21 +377,17 @@ open class ActorHumanoid : ActorWithBody, Controllable, Pocketed, Factionable, L
// ↑F, ↓S // ↑F, ↓S
if (isRightDown && !isLeftDown) { if (isRightDown && !isLeftDown) {
walkHorizontal(false, AXIS_KEYBOARD) walkHorizontal(false, AXIS_KEYBOARD)
prevHMoveKey = ControlPresets.getKey("control_key_right")
} // ↓F, ↑S } // ↓F, ↑S
else if (isLeftDown && !isRightDown) { else if (isLeftDown && !isRightDown) {
walkHorizontal(true, AXIS_KEYBOARD) walkHorizontal(true, AXIS_KEYBOARD)
prevHMoveKey = ControlPresets.getKey("control_key_left") } // ↓F, ↓S (last key pressed wins)
} // ↓F, ↓S else if (isLeftDown && isRightDown) {
/*else if (isLeftDown && isRightDown) { if (prevHMoveKey == ControlPresets.getKey("control_key_right")) {
if (prevHMoveKey == KeyMap.getKeyCode(EnumKeyFunc.MOVE_LEFT)) { walkHorizontal(false, AXIS_KEYBOARD)
walkHorizontal(false, AXIS_KEYBOARD) } else if (prevHMoveKey == ControlPresets.getKey("control_key_left")) {
prevHMoveKey = KeyMap.getKeyCode(EnumKeyFunc.MOVE_RIGHT) walkHorizontal(true, AXIS_KEYBOARD)
} else if (prevHMoveKey == KeyMap.getKeyCode(EnumKeyFunc.MOVE_RIGHT)) { }
walkHorizontal(true, AXIS_KEYBOARD) }
prevHMoveKey = KeyMap.getKeyCode(EnumKeyFunc.MOVE_LEFT)
}
}*/
/** /**
* Up/Down movement * Up/Down movement
@@ -387,21 +401,17 @@ open class ActorHumanoid : ActorWithBody, Controllable, Pocketed, Factionable, L
// ↑E, ↓D // ↑E, ↓D
if (isDownDown && !isUpDown) { if (isDownDown && !isUpDown) {
walkVertical(false, AXIS_KEYBOARD) walkVertical(false, AXIS_KEYBOARD)
prevVMoveKey = ControlPresets.getKey("control_key_down")
} // ↓E, ↑D } // ↓E, ↑D
else if (isUpDown && !isDownDown) { else if (isUpDown && !isDownDown) {
walkVertical(true, AXIS_KEYBOARD) walkVertical(true, AXIS_KEYBOARD)
prevVMoveKey = ControlPresets.getKey("control_key_up") } // ↓E, ↓D (last key pressed wins)
} // ↓E, ↓D else if (isUpDown && isDownDown) {
/*else if (isUpDown && isDownDown) { if (prevVMoveKey == ControlPresets.getKey("control_key_down")) {
if (prevVMoveKey == KeyMap.getKeyCode(EnumKeyFunc.MOVE_UP)) {
walkVertical(false, AXIS_KEYBOARD) walkVertical(false, AXIS_KEYBOARD)
prevVMoveKey = KeyMap.getKeyCode(EnumKeyFunc.MOVE_DOWN) } else if (prevVMoveKey == ControlPresets.getKey("control_key_up")) {
} else if (prevVMoveKey == KeyMap.getKeyCode(EnumKeyFunc.MOVE_DOWN)) {
walkVertical(true, AXIS_KEYBOARD) walkVertical(true, AXIS_KEYBOARD)
prevVMoveKey = KeyMap.getKeyCode(EnumKeyFunc.MOVE_UP)
} }
}*/ }
} }
else { else {
if (hasController) { if (hasController) {
@@ -412,11 +422,16 @@ open class ActorHumanoid : ActorWithBody, Controllable, Pocketed, Factionable, L
// ↑E, ↓D // ↑E, ↓D
if (isDownDown && !isUpDown) { if (isDownDown && !isUpDown) {
swimDown() swimDown()
prevVMoveKey = ControlPresets.getKey("control_key_down")
} // ↓E, ↑D } // ↓E, ↑D
else if (isUpDown && !isDownDown) { else if (isUpDown && !isDownDown) {
swimUp() swimUp()
prevVMoveKey = ControlPresets.getKey("control_key_up") } // ↓E, ↓D (last key pressed wins)
else if (isUpDown && isDownDown) {
if (prevVMoveKey == ControlPresets.getKey("control_key_down")) {
swimDown()
} else if (prevVMoveKey == ControlPresets.getKey("control_key_up")) {
swimUp()
}
} }
} }