From 6f09036814048dbfdd58438d18a674dd77d4509b Mon Sep 17 00:00:00 2001 From: LambdAurora Date: Wed, 27 Nov 2019 23:03:06 +0100 Subject: [PATCH] :construction: More touchscreen work. --- .../gui/TouchscreenButtonWidget.java | 8 ++ .../gui/TouchscreenOverlay.java | 123 +++++++++++++++--- .../lambdacontrols/textures/gui/widgets.png | Bin 9123 -> 13320 bytes 3 files changed, 115 insertions(+), 16 deletions(-) diff --git a/src/main/java/me/lambdaurora/lambdacontrols/gui/TouchscreenButtonWidget.java b/src/main/java/me/lambdaurora/lambdacontrols/gui/TouchscreenButtonWidget.java index b8352f9..6b5d4e3 100644 --- a/src/main/java/me/lambdaurora/lambdacontrols/gui/TouchscreenButtonWidget.java +++ b/src/main/java/me/lambdaurora/lambdacontrols/gui/TouchscreenButtonWidget.java @@ -51,4 +51,12 @@ public class TouchscreenButtonWidget extends TexturedButtonWidget } else return false; } + + @Override + protected void onDrag(double mouseX, double mouseY, double deltaX, double deltaY) + { + super.onDrag(mouseX, mouseY, deltaX, deltaY); + if (this.active && !this.isHovered) + this.on_change_state.accept(false); + } } diff --git a/src/main/java/me/lambdaurora/lambdacontrols/gui/TouchscreenOverlay.java b/src/main/java/me/lambdaurora/lambdacontrols/gui/TouchscreenOverlay.java index 8472456..9553fef 100644 --- a/src/main/java/me/lambdaurora/lambdacontrols/gui/TouchscreenOverlay.java +++ b/src/main/java/me/lambdaurora/lambdacontrols/gui/TouchscreenOverlay.java @@ -31,8 +31,16 @@ import org.jetbrains.annotations.NotNull; */ public class TouchscreenOverlay extends Screen { - public static final Identifier WIDGETS_LOCATION = new Identifier("lambdacontrols", "textures/gui/widgets.png"); + public static final Identifier WIDGETS_LOCATION = new Identifier("lambdacontrols", "textures/gui/widgets.png"); private LambdaControls mod; + private TouchscreenButtonWidget jump_button; + private TouchscreenButtonWidget fly_button; + private TouchscreenButtonWidget fly_up_button; + private TouchscreenButtonWidget fly_down_button; + private int fly_button_enable_ticks = 0; + private int forward_button_tick = 0; + private TouchscreenButtonWidget forward_left_button; + private TouchscreenButtonWidget forward_right_button; private TouchscreenButtonWidget start_sneak_button; private TouchscreenButtonWidget end_sneak_button; @@ -43,12 +51,6 @@ public class TouchscreenOverlay extends Screen this.passEvents = true; } - @Override - public boolean shouldCloseOnEsc() - { - return false; - } - @Override public boolean isPauseScreen() { @@ -56,9 +58,9 @@ public class TouchscreenOverlay extends Screen } @Override - public void onClose() + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - super.onClose(); + return false; } private void pause_game(boolean bl) @@ -74,7 +76,68 @@ public class TouchscreenOverlay extends Screen } } + /** + * Updates the forward button ticks cooldown. + * + * @param state The button state. + */ + private void update_forward_buttons_state(boolean state) + { + if (state) + this.forward_button_tick = -1; + else + this.forward_button_tick = 20; + } + + /** + * Updates the jump buttons. + */ + private void update_jump_buttons() + { + if (this.minecraft == null) + return; + if (this.minecraft.player.abilities.allowFlying && this.minecraft.player.abilities.flying) { + boolean old_state_fly = this.fly_button.visible; + this.jump_button.visible = false; + this.fly_button.visible = true; + this.fly_up_button.visible = true; + this.fly_down_button.visible = true; + if (old_state_fly != this.fly_button.visible) + this.fly_button_enable_ticks = 5; + else if (this.fly_button_enable_ticks > 0) + this.fly_button_enable_ticks--; + } else { + this.jump_button.visible = true; + this.fly_button.visible = false; + this.fly_up_button.visible = false; + this.fly_down_button.visible = false; + } + } + + /** + * Handles the jump button. + * + * @param state The state of the jump button. + */ + private void handle_jump(boolean state) + { + ((LambdaKeyBinding) this.minecraft.options.keyJump).handle_press_state(state); + } + @Override + public void tick() + { + if (this.forward_button_tick > 0) { + this.forward_button_tick--; + } else if (this.forward_button_tick == 0) { + if (this.forward_left_button.visible) + this.forward_left_button.visible = false; + if (this.forward_right_button.visible) + this.forward_right_button.visible = false; + } + this.update_jump_buttons(); + } + protected void init() { super.init(); @@ -105,15 +168,15 @@ public class TouchscreenOverlay extends Screen int sneak_button_y = scaled_height - 10 - 40 - 5; if (this.mod.config.get_hud_side() == HudSide.LEFT) { jump_button_x = scaled_width - 20 - 20; - swap_hands_x = jump_button_x - 5 - 20; + swap_hands_x = jump_button_x - 5 - 40; sneak_button_x = 10 + 20 + 5; } else { jump_button_x = 20; - swap_hands_x = jump_button_x + 5 + 20; + swap_hands_x = jump_button_x + 5 + 40; sneak_button_x = scaled_width - 10 - 40 - 5; } // Swap items hand. - this.addButton(new TouchscreenButtonWidget(swap_hands_x, scaled_height - 5 - 20 - 40, 20, 20, 0, 0, 20, WIDGETS_LOCATION, + this.addButton(new TouchscreenButtonWidget(swap_hands_x, sneak_button_y, 20, 20, 0, 160, 20, WIDGETS_LOCATION, state -> { if (state) { if (!this.minecraft.player.isSpectator()) { @@ -122,11 +185,20 @@ public class TouchscreenOverlay extends Screen } })); // Drop - this.addButton(new TouchscreenButtonWidget(swap_hands_x, scaled_height - 40, 20, 20, 0, 0, 20, WIDGETS_LOCATION, + this.addButton(new TouchscreenButtonWidget(swap_hands_x, sneak_button_y + 5 + 20, 20, 20, 20, 160, 20, WIDGETS_LOCATION, state -> ((LambdaKeyBinding) this.minecraft.options.keyDrop).handle_press_state(state))); // Jump keys - this.addButton(new TouchscreenButtonWidget(jump_button_x, scaled_height - 40, 20, 20, 0, 40, 20, WIDGETS_LOCATION, - state -> ((LambdaKeyBinding) this.minecraft.options.keyJump).handle_press_state(state))); + this.addButton(this.jump_button = new TouchscreenButtonWidget(jump_button_x, sneak_button_y, 20, 20, 0, 40, 20, WIDGETS_LOCATION, + this::handle_jump)); + this.addButton(this.fly_button = new TouchscreenButtonWidget(jump_button_x, sneak_button_y, 20, 20, 20, 40, 20, WIDGETS_LOCATION, + state -> { + if (this.fly_button_enable_ticks == 0) this.minecraft.player.abilities.flying = false; + })); + this.addButton(this.fly_up_button = new TouchscreenButtonWidget(jump_button_x, sneak_button_y - 5 - 20, 20, 20, 40, 40, 20, WIDGETS_LOCATION, + this::handle_jump)); + this.addButton(this.fly_down_button = new TouchscreenButtonWidget(jump_button_x, sneak_button_y + 20 + 5, 20, 20, 60, 40, 20, WIDGETS_LOCATION, + state -> ((LambdaKeyBinding) this.minecraft.options.keySneak).handle_press_state(state))); + this.update_jump_buttons(); // Movements keys this.addButton((this.start_sneak_button = new TouchscreenButtonWidget(sneak_button_x, sneak_button_y, 20, 20, 0, 120, 20, WIDGETS_LOCATION, state -> { @@ -145,8 +217,27 @@ public class TouchscreenOverlay extends Screen } }))); this.end_sneak_button.visible = false; + this.addButton(this.forward_left_button = new TouchscreenButtonWidget(sneak_button_x - 20 - 5, sneak_button_y - 5 - 20, 20, 20, 80, 80, 20, WIDGETS_LOCATION, + state -> { + ((LambdaKeyBinding) this.minecraft.options.keyForward).handle_press_state(state); + ((LambdaKeyBinding) this.minecraft.options.keyLeft).handle_press_state(state); + this.update_forward_buttons_state(state); + })); + this.forward_left_button.visible = false; this.addButton(new TouchscreenButtonWidget(sneak_button_x, sneak_button_y - 5 - 20, 20, 20, 0, 80, 20, WIDGETS_LOCATION, - state -> ((LambdaKeyBinding) this.minecraft.options.keyForward).handle_press_state(state))); + state -> { + ((LambdaKeyBinding) this.minecraft.options.keyForward).handle_press_state(state); + this.update_forward_buttons_state(state); + this.forward_left_button.visible = true; + this.forward_right_button.visible = true; + })); + this.addButton(this.forward_right_button = new TouchscreenButtonWidget(sneak_button_x + 20 + 5, sneak_button_y - 5 - 20, 20, 20, 100, 80, 20, WIDGETS_LOCATION, + state -> { + ((LambdaKeyBinding) this.minecraft.options.keyForward).handle_press_state(state); + ((LambdaKeyBinding) this.minecraft.options.keyRight).handle_press_state(state); + this.update_forward_buttons_state(state); + })); + this.forward_right_button.visible = true; this.addButton(new TouchscreenButtonWidget(sneak_button_x + 20 + 5, sneak_button_y, 20, 20, 20, 80, 20, WIDGETS_LOCATION, state -> ((LambdaKeyBinding) this.minecraft.options.keyRight).handle_press_state(state))); this.addButton(new TouchscreenButtonWidget(sneak_button_x, sneak_button_y + 20 + 5, 20, 20, 40, 80, 20, WIDGETS_LOCATION, diff --git a/src/main/resources/assets/lambdacontrols/textures/gui/widgets.png b/src/main/resources/assets/lambdacontrols/textures/gui/widgets.png index 71398909a4fc88f19cd2fa427b1a495f9cd8a05c..f684d6ade1e8ac4f6da334cb0fbec91385b63172 100644 GIT binary patch literal 13320 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 Xk1kipZ0Z3|-GB@)BlSLBLOu8&3HgCz