diff --git a/data/ui/touch/rewind.png b/data/ui/touch/rewind.png new file mode 100644 index 00000000..69e49e8b Binary files /dev/null and b/data/ui/touch/rewind.png differ diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index c6989312..38860dbb 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -991,10 +991,13 @@ class MarbleWorld extends Scheduler { var realDt = dt; - if (Key.isDown(Settings.controlsSettings.rewind) && Settings.optionsSettings.rewindEnabled && !this.isWatching) { + if ((Key.isDown(Settings.controlsSettings.rewind) || MarbleGame.instance.touchInput.rewindButton.pressed) + && Settings.optionsSettings.rewindEnabled + && !this.isWatching) { this.rewinding = true; } else { - if (Key.isReleased(Settings.controlsSettings.rewind) && this.rewinding) { + if ((Key.isReleased(Settings.controlsSettings.rewind) || !MarbleGame.instance.touchInput.rewindButton.pressed) + && this.rewinding) { if (this.isRecording) { this.replay.spliceReplay(timeState.currentAttemptTime); } diff --git a/src/Settings.hx b/src/Settings.hx index 14eedc37..c4b6bdc0 100644 --- a/src/Settings.hx +++ b/src/Settings.hx @@ -75,6 +75,8 @@ typedef TouchSettings = { var powerupButtonSize:Float; var blastButtonPos:Array; var blastButtonSize:Float; + var rewindButtonPos:Array; + var rewindButtonSize:Float; var buttonJoystickMultiplier:Float; } @@ -159,6 +161,8 @@ class Settings { powerupButtonSize: 60, blastButtonPos: [300, 240], blastButtonSize: 60, + rewindButtonPos: [380, 240], + rewindButtonSize: 60, buttonJoystickMultiplier: 2.5 } @@ -354,6 +358,10 @@ class Settings { touchSettings.blastButtonPos = [300, 240]; touchSettings.blastButtonSize = 60; } + if (touchSettings.rewindButtonPos == null) { + touchSettings.rewindButtonPos = [380, 240]; + touchSettings.rewindButtonSize = 60; + } if (json.gamepad != null) { gamepadSettings = json.gamepad; } diff --git a/src/gui/GuiScrollCtrl.hx b/src/gui/GuiScrollCtrl.hx index 6b9cf986..e8db4a6d 100644 --- a/src/gui/GuiScrollCtrl.hx +++ b/src/gui/GuiScrollCtrl.hx @@ -14,6 +14,7 @@ class GuiScrollCtrl extends GuiControl { public var scrollY:Float = 0; public var enabled:Bool = true; public var childrenHandleScroll:Bool = false; + public var scrollSpeed = 500; var maxScrollY:Float; @@ -102,7 +103,8 @@ class GuiScrollCtrl extends GuiControl { public override function getRenderRectangle():Rect { var rrec = super.getRenderRectangle(); - rrec.scroll.y = scrollY * this.maxScrollY / rrec.extent.y; + if (!this.childrenHandleScroll) + rrec.scroll.y = scrollY * this.maxScrollY / rrec.extent.y; return rrec; } @@ -220,6 +222,7 @@ class GuiScrollCtrl extends GuiControl { if (Util.isTouchDevice()) { this.pressed = false; this.dirty = true; + deltaY = 0; this.updateScrollVisual(); } } @@ -228,7 +231,8 @@ class GuiScrollCtrl extends GuiControl { if (Util.isTouchDevice()) { super.onMouseMove(mouseState); if (this.pressed) { - var dy = mouseState.position.y - this.prevMousePos.y; + var dy = (mouseState.position.y - this.prevMousePos.y) * scrollSpeed / this.maxScrollY; + deltaY = -dy; this.scrollY -= dy; this.prevMousePos = mouseState.position; this.updateScrollVisual(); diff --git a/src/gui/HelpCreditsGui.hx b/src/gui/HelpCreditsGui.hx index 57723fd3..e9db3bc9 100644 --- a/src/gui/HelpCreditsGui.hx +++ b/src/gui/HelpCreditsGui.hx @@ -81,6 +81,7 @@ class HelpCreditsGui extends GuiImage { .toTile()); scrollCtrl2.position = new Vector(219, 28); scrollCtrl2.extent = new Vector(386, 342); + scrollCtrl2.childrenHandleScroll = true; wnd.addChild(scrollCtrl2); var arial14fontdata = ResourceLoader.getFileEntry("data/font/arial.fnt"); diff --git a/src/gui/TouchCtrlsEditGui.hx b/src/gui/TouchCtrlsEditGui.hx index 1ebf9d2f..6da9ec1b 100644 --- a/src/gui/TouchCtrlsEditGui.hx +++ b/src/gui/TouchCtrlsEditGui.hx @@ -67,11 +67,15 @@ class TouchCtrlsEditGui extends GuiImage { var blastBtn = new TouchEditButton(ResourceLoader.getImage("data/ui/touch/explosion.png").resource, new Vector(Settings.touchSettings.blastButtonPos[0], Settings.touchSettings.blastButtonPos[1]), Settings.touchSettings.blastButtonSize); + var rewindBtn = new TouchEditButton(ResourceLoader.getImage("data/ui/touch/rewind.png").resource, + new Vector(Settings.touchSettings.rewindButtonPos[0], Settings.touchSettings.rewindButtonPos[1]), Settings.touchSettings.rewindButtonSize); + jumpBtn.onClick = (sender, mousePos) -> { sender.setSelected(true); powerupBtn.setSelected(false); joystick.setSelected(false); blastBtn.setSelected(false); + rewindBtn.setSelected(false); } jumpBtn.onChangeCb = (sender, value, rvalue) -> { @@ -84,6 +88,7 @@ class TouchCtrlsEditGui extends GuiImage { jumpBtn.setSelected(false); joystick.setSelected(false); blastBtn.setSelected(false); + rewindBtn.setSelected(false); } powerupBtn.onChangeCb = (sender, value, rvalue) -> { @@ -96,6 +101,7 @@ class TouchCtrlsEditGui extends GuiImage { jumpBtn.setSelected(false); powerupBtn.setSelected(false); joystick.setSelected(false); + rewindBtn.setSelected(false); } blastBtn.onChangeCb = (sender, value, rvalue) -> { @@ -103,11 +109,25 @@ class TouchCtrlsEditGui extends GuiImage { Settings.touchSettings.blastButtonSize = rvalue; } + rewindBtn.onClick = (sender, mousePos) -> { + sender.setSelected(true); + jumpBtn.setSelected(false); + powerupBtn.setSelected(false); + joystick.setSelected(false); + blastBtn.setSelected(false); + } + + rewindBtn.onChangeCb = (sender, value, rvalue) -> { + Settings.touchSettings.rewindButtonPos = [value.x, value.y]; + Settings.touchSettings.rewindButtonSize = rvalue; + } + joystick.onClick = (mousePos) -> { joystick.setSelected(true); jumpBtn.setSelected(false); powerupBtn.setSelected(false); blastBtn.setSelected(false); + rewindBtn.setSelected(false); } joystick.onChangeCb = (value, rvalue) -> { @@ -121,5 +141,6 @@ class TouchCtrlsEditGui extends GuiImage { this.addChild(jumpBtn); this.addChild(powerupBtn); this.addChild(blastBtn); + this.addChild(rewindBtn); } } diff --git a/src/touch/RewindButton.hx b/src/touch/RewindButton.hx new file mode 100644 index 00000000..a2b3f016 --- /dev/null +++ b/src/touch/RewindButton.hx @@ -0,0 +1,14 @@ +package touch; + +import touch.TouchInput.Touch; +import h3d.Vector; +import hxd.Window; +import src.ResourceLoader; +import src.Settings; + +class RewindButton extends TouchButton { + public function new() { + super(ResourceLoader.getImage("data/ui/touch/rewind.png").resource, + new Vector(Settings.touchSettings.rewindButtonPos[0], Settings.touchSettings.rewindButtonPos[1]), Settings.touchSettings.rewindButtonSize); + } +} diff --git a/src/touch/TouchInput.hx b/src/touch/TouchInput.hx index 485c0fae..3fc0e430 100644 --- a/src/touch/TouchInput.hx +++ b/src/touch/TouchInput.hx @@ -42,6 +42,7 @@ class TouchInput { public var powerupButton:PowerupButton; public var blastbutton:BlastButton; public var pauseButton:PauseButton; + public var rewindButton:RewindButton; public var restartButton:RestartButton; public var currentTouchState:TouchEventState; @@ -57,6 +58,7 @@ class TouchInput { this.powerupButton = new PowerupButton(); this.blastbutton = new BlastButton(); this.pauseButton = new PauseButton(); + this.rewindButton = new RewindButton(); this.restartButton = new RestartButton(); this.currentTouchState = new TouchEventState(); this.previousTouchState = new TouchEventState(); @@ -116,6 +118,8 @@ class TouchInput { this.movementInput = new MovementInput(); this.jumpButton = new JumpButton(); this.powerupButton = new PowerupButton(); + if (Settings.optionsSettings.rewindEnabled) + this.rewindButton = new RewindButton(); if (ultra) this.blastbutton = new BlastButton(); this.pauseButton = new PauseButton(); @@ -124,6 +128,8 @@ class TouchInput { restartButton.add(parentGui); jumpButton.add(parentGui); powerupButton.add(parentGui); + if (Settings.optionsSettings.rewindEnabled) + rewindButton.add(parentGui); if (ultra) blastbutton.add(parentGui); movementInput.add(parentGui); @@ -139,6 +145,8 @@ class TouchInput { this.movementInput.setVisible(enabled); this.pauseButton.setVisible(enabled); this.restartButton.setVisible(enabled); + if (this.rewindButton != null) + this.rewindButton.setVisible(enabled); this.cameraInput.enabled = enabled; } @@ -151,11 +159,15 @@ class TouchInput { pauseButton.remove(parentGui); restartButton.remove(parentGui); cameraInput.remove(parentGui); + if (this.rewindButton != null) + rewindButton.remove(parentGui); jumpButton.dispose(); powerupButton.dispose(); movementInput.dispose(); pauseButton.dispose(); restartButton.dispose(); cameraInput.dispose(); + if (this.rewindButton != null) + rewindButton.dispose(); } }