diff --git a/.changes/unreleased/Changed-20240826-080222.yaml b/.changes/unreleased/Changed-20240826-080222.yaml new file mode 100644 index 000000000..0599a0adf --- /dev/null +++ b/.changes/unreleased/Changed-20240826-080222.yaml @@ -0,0 +1,3 @@ +kind: Changed +body: Steering is now smoother, especially on Android. +time: 2024-08-26T08:02:22.121774707+02:00 diff --git a/core/src/com/agateau/pixelwheels/gameinput/TouchInputUtils.java b/core/src/com/agateau/pixelwheels/gameinput/DigitalSteering.java similarity index 59% rename from core/src/com/agateau/pixelwheels/gameinput/TouchInputUtils.java rename to core/src/com/agateau/pixelwheels/gameinput/DigitalSteering.java index 0342ec769..f0a711569 100644 --- a/core/src/com/agateau/pixelwheels/gameinput/TouchInputUtils.java +++ b/core/src/com/agateau/pixelwheels/gameinput/DigitalSteering.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 Aurélien Gâteau + * Copyright 2024 Compl Yue * * This file is part of Pixel Wheels. * @@ -19,18 +19,21 @@ package com.agateau.pixelwheels.gameinput; import com.agateau.pixelwheels.GamePlay; -import com.agateau.pixelwheels.racescreen.HudButton; import com.badlogic.gdx.math.MathUtils; -class TouchInputUtils { - static float applyDirectionInput(HudButton leftButton, HudButton rightButton, float direction) { - if (leftButton.isPressed()) { - direction += GamePlay.instance.steeringStep; - } else if (rightButton.isPressed()) { - direction -= GamePlay.instance.steeringStep; +public class DigitalSteering { + private float mRawDirection = 0; + + public float steer(boolean left, boolean right) { + if (left == right) { + // Either both left & right are pressed or none of them are + mRawDirection *= 0.4; + } else if (left) { + mRawDirection += GamePlay.instance.steeringStep; } else { - direction = 0; + mRawDirection -= GamePlay.instance.steeringStep; } - return MathUtils.clamp(direction, -1, 1); + mRawDirection = MathUtils.clamp(mRawDirection, -1, 1); + return mRawDirection * mRawDirection * Math.signum(mRawDirection); } } diff --git a/core/src/com/agateau/pixelwheels/gameinput/InputMapperInputHandler.java b/core/src/com/agateau/pixelwheels/gameinput/InputMapperInputHandler.java index 9d848095a..6f49a7179 100644 --- a/core/src/com/agateau/pixelwheels/gameinput/InputMapperInputHandler.java +++ b/core/src/com/agateau/pixelwheels/gameinput/InputMapperInputHandler.java @@ -19,18 +19,18 @@ package com.agateau.pixelwheels.gameinput; import com.agateau.pixelwheels.Assets; -import com.agateau.pixelwheels.GamePlay; import com.agateau.pixelwheels.bonus.Bonus; +import com.agateau.pixelwheels.debug.DebugStringMap; import com.agateau.pixelwheels.racescreen.Hud; import com.agateau.ui.InputMapper; import com.agateau.ui.VirtualKey; import com.badlogic.gdx.Preferences; -import com.badlogic.gdx.math.MathUtils; /** Base class for InputMapper-based GameInputHandlers */ public abstract class InputMapperInputHandler implements GameInputHandler { private final InputMapper mInputMapper; private final GameInput mInput = new GameInput(); + private final DigitalSteering mSteer = new DigitalSteering(); InputMapperInputHandler(InputMapper inputMapper) { mInputMapper = inputMapper; @@ -42,14 +42,11 @@ public GameInput getGameInput() { mInputMapper.isKeyPressed(VirtualKey.DOWN) || mInputMapper.isKeyPressed(VirtualKey.BACK); mInput.accelerating = !mInput.braking; - if (mInputMapper.isKeyPressed(VirtualKey.LEFT)) { - mInput.direction += GamePlay.instance.steeringStep; - } else if (mInputMapper.isKeyPressed(VirtualKey.RIGHT)) { - mInput.direction -= GamePlay.instance.steeringStep; - } else { - mInput.direction *= 0.4; - } - mInput.direction = MathUtils.clamp(mInput.direction, -1, 1); + mInput.direction = + mSteer.steer( + mInputMapper.isKeyPressed(VirtualKey.LEFT), + mInputMapper.isKeyPressed(VirtualKey.RIGHT)); + DebugStringMap.putPercent("direction", (float) (Math.abs(mInput.direction))); mInput.triggeringBonus = mInputMapper.isKeyPressed(VirtualKey.TRIGGER); return mInput; diff --git a/core/src/com/agateau/pixelwheels/gameinput/PieTouchInputHandler.java b/core/src/com/agateau/pixelwheels/gameinput/PieTouchInputHandler.java index 6392ad796..fd7917ae7 100644 --- a/core/src/com/agateau/pixelwheels/gameinput/PieTouchInputHandler.java +++ b/core/src/com/agateau/pixelwheels/gameinput/PieTouchInputHandler.java @@ -32,6 +32,7 @@ /** Handle input using pie buttons in the bottom left and right corners */ public class PieTouchInputHandler implements GameInputHandler { private final GameInput mInput = new GameInput(); + private final DigitalSteering mSteer = new DigitalSteering(); private PieButton mLeftButton, mRightButton, mBrakeButton, mBonusButton; public static class Factory implements GameInputHandlerFactory { @@ -61,8 +62,7 @@ public Array getAllHandlers() { public GameInput getGameInput() { mInput.braking = mBrakeButton.isPressed(); mInput.accelerating = !mInput.braking; - mInput.direction = - TouchInputUtils.applyDirectionInput(mLeftButton, mRightButton, mInput.direction); + mInput.direction = mSteer.steer(mLeftButton.isPressed(), mRightButton.isPressed()); mInput.triggeringBonus = mBonusButton.isPressed(); return mInput; } diff --git a/core/src/com/agateau/pixelwheels/gameinput/SidesTouchInputHandler.java b/core/src/com/agateau/pixelwheels/gameinput/SidesTouchInputHandler.java index 8c0ddc4ff..c89ed0393 100644 --- a/core/src/com/agateau/pixelwheels/gameinput/SidesTouchInputHandler.java +++ b/core/src/com/agateau/pixelwheels/gameinput/SidesTouchInputHandler.java @@ -32,6 +32,7 @@ /** Handle input using buttons on the sides */ public class SidesTouchInputHandler implements GameInputHandler { private final GameInput mInput = new GameInput(); + private final DigitalSteering mSteer = new DigitalSteering(); private HudButton mLeftButton, mRightButton, mBonusButton; public static class Factory implements GameInputHandlerFactory { @@ -61,11 +62,7 @@ public Array getAllHandlers() { public GameInput getGameInput() { mInput.braking = isBraking(); mInput.accelerating = !mInput.braking; - if (!mInput.braking) { - mInput.direction = - TouchInputUtils.applyDirectionInput( - mLeftButton, mRightButton, mInput.direction); - } + mInput.direction = mSteer.steer(mLeftButton.isPressed(), mRightButton.isPressed()); mInput.triggeringBonus = mBonusButton.isPressed(); return mInput; }