From 39450065c12ba426a315cdf14b54d8629d5786c7 Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Sun, 11 Dec 2022 14:51:48 +0530 Subject: [PATCH] add blast button for touch controls --- data/ui/touch/explosion.png | Bin 0 -> 19732 bytes src/MarbleWorld.hx | 5 ++++- src/Settings.hx | 8 ++++++++ src/fs/ManifestFileSystem.hx | 3 +-- src/gui/PlayGui.hx | 5 ++++- src/gui/TouchCtrlsEditGui.hx | 19 +++++++++++++++++++ src/touch/BlastButton.hx | 15 +++++++++++++++ src/touch/TouchInput.hx | 16 +++++++++++++--- 8 files changed, 64 insertions(+), 7 deletions(-) create mode 100644 data/ui/touch/explosion.png create mode 100644 src/touch/BlastButton.hx diff --git a/data/ui/touch/explosion.png b/data/ui/touch/explosion.png new file mode 100644 index 0000000000000000000000000000000000000000..ad613511182d0b4ac4fc6582172c30949c77b4fc GIT binary patch literal 19732 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 O16ate;QDQeKmG?~*CCw% literal 0 HcmV?d00001 diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index 810349d8..946eb123 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -1160,7 +1160,10 @@ class MarbleWorld extends Scheduler { this.tickSchedule(timeState.currentAttemptTime); - if (Key.isPressed(Settings.controlsSettings.blast) && !this.isWatching && this.game == "ultra") { + if (Key.isPressed(Settings.controlsSettings.blast) + || (MarbleGame.instance.touchInput.blastbutton.pressed) + && !this.isWatching + && this.game == "ultra") { this.marble.useBlast(); } diff --git a/src/Settings.hx b/src/Settings.hx index 72ed8279..cd174305 100644 --- a/src/Settings.hx +++ b/src/Settings.hx @@ -67,6 +67,8 @@ typedef TouchSettings = { var jumpButtonSize:Float; var powerupButtonPos:Array; var powerupButtonSize:Float; + var blastButtonPos:Array; + var blastButtonSize:Float; var buttonJoystickMultiplier:Float; } @@ -131,6 +133,8 @@ class Settings { jumpButtonSize: 60, powerupButtonPos: [440, 180], powerupButtonSize: 60, + blastButtonPos: [300, 240], + blastButtonSize: 60, buttonJoystickMultiplier: 2.5 } @@ -287,6 +291,10 @@ class Settings { if (json.touch != null) { touchSettings = json.touch; } + if (touchSettings.blastButtonPos == null) { + touchSettings.blastButtonPos = [300, 240]; + touchSettings.blastButtonSize = 60; + } if (json.stats != null) { playStatistics = json.stats; } diff --git a/src/fs/ManifestFileSystem.hx b/src/fs/ManifestFileSystem.hx index 29a4ee23..ad099099 100644 --- a/src/fs/ManifestFileSystem.hx +++ b/src/fs/ManifestFileSystem.hx @@ -47,7 +47,6 @@ class ManifestEntry extends FileEntry { private var bytes:Bytes; private var readPos:Int; private var loaded:Bool; - private var loadPromise:js.lib.Promise; #end public function new(fs:ManifestFileSystem, name:String, relPath:String, file:String, ?originalFile:String) { @@ -131,7 +130,7 @@ class ManifestEntry extends FileEntry { if (onReady != null) haxe.Timer.delay(onReady, 1); } else { - this.loadPromise = js.Browser.window.fetch(file).then((res:js.html.Response) -> { + js.Browser.window.fetch(file).then((res:js.html.Response) -> { return res.arrayBuffer(); }).then((buf:js.lib.ArrayBuffer) -> { loaded = true; diff --git a/src/gui/PlayGui.hx b/src/gui/PlayGui.hx index 297f2180..6c5a29bf 100644 --- a/src/gui/PlayGui.hx +++ b/src/gui/PlayGui.hx @@ -154,7 +154,7 @@ class PlayGui { initFPSMeter(); if (Util.isTouchDevice()) { - MarbleGame.instance.touchInput.showControls(this.playGuiCtrl); + MarbleGame.instance.touchInput.showControls(this.playGuiCtrl, game == 'ultra'); } playGuiCtrl.render(scene2d); @@ -461,13 +461,16 @@ class PlayGui { blastFill.extent = new Vector(Util.lerp(0, 110, value), 17); if (oldVal < 22 && blastFill.extent.x >= 22) { blastFill.bmp.tile = ResourceLoader.getResource("data/ui/game/blastbar_bargreen.png", ResourceLoader.getImage, this.imageResources).toTile(); + MarbleGame.instance.touchInput.blastbutton.setEnabled(true); } if (oldVal >= 22 && blastFill.extent.x < 22) { blastFill.bmp.tile = ResourceLoader.getResource("data/ui/game/blastbar_bargray.png", ResourceLoader.getImage, this.imageResources).toTile(); + MarbleGame.instance.touchInput.blastbutton.setEnabled(false); } } else { blastFill.extent = new Vector(0, 16); // WE will just use this extra number to store whether it was previously charged or not blastFrame.bmp.tile = ResourceLoader.getResource("data/ui/game/blastbar_charged.png", ResourceLoader.getImage, this.imageResources).toTile(); + MarbleGame.instance.touchInput.blastbutton.setEnabled(true); } this.blastBar.render(scene2d); } diff --git a/src/gui/TouchCtrlsEditGui.hx b/src/gui/TouchCtrlsEditGui.hx index c68924ac..1ebf9d2f 100644 --- a/src/gui/TouchCtrlsEditGui.hx +++ b/src/gui/TouchCtrlsEditGui.hx @@ -64,10 +64,14 @@ class TouchCtrlsEditGui extends GuiImage { var powerupBtn = new TouchEditButton(ResourceLoader.getImage("data/ui/touch/energy.png").resource, new Vector(Settings.touchSettings.powerupButtonPos[0], Settings.touchSettings.powerupButtonPos[1]), Settings.touchSettings.powerupButtonSize); + 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); + jumpBtn.onClick = (sender, mousePos) -> { sender.setSelected(true); powerupBtn.setSelected(false); joystick.setSelected(false); + blastBtn.setSelected(false); } jumpBtn.onChangeCb = (sender, value, rvalue) -> { @@ -79,6 +83,7 @@ class TouchCtrlsEditGui extends GuiImage { sender.setSelected(true); jumpBtn.setSelected(false); joystick.setSelected(false); + blastBtn.setSelected(false); } powerupBtn.onChangeCb = (sender, value, rvalue) -> { @@ -86,10 +91,23 @@ class TouchCtrlsEditGui extends GuiImage { Settings.touchSettings.powerupButtonSize = rvalue; } + blastBtn.onClick = (sender, mousePos) -> { + sender.setSelected(true); + jumpBtn.setSelected(false); + powerupBtn.setSelected(false); + joystick.setSelected(false); + } + + blastBtn.onChangeCb = (sender, value, rvalue) -> { + Settings.touchSettings.blastButtonPos = [value.x, value.y]; + Settings.touchSettings.blastButtonSize = rvalue; + } + joystick.onClick = (mousePos) -> { joystick.setSelected(true); jumpBtn.setSelected(false); powerupBtn.setSelected(false); + blastBtn.setSelected(false); } joystick.onChangeCb = (value, rvalue) -> { @@ -102,5 +120,6 @@ class TouchCtrlsEditGui extends GuiImage { this.addChild(joystick); this.addChild(jumpBtn); this.addChild(powerupBtn); + this.addChild(blastBtn); } } diff --git a/src/touch/BlastButton.hx b/src/touch/BlastButton.hx new file mode 100644 index 00000000..689047bd --- /dev/null +++ b/src/touch/BlastButton.hx @@ -0,0 +1,15 @@ +package touch; + +import touch.TouchInput.Touch; +import h3d.Vector; +import hxd.Window; +import src.ResourceLoader; +import src.Settings; + +class BlastButton extends TouchButton { + public function new() { + super(ResourceLoader.getImage("data/ui/touch/explosion.png").resource, + new Vector(Settings.touchSettings.blastButtonPos[0], Settings.touchSettings.blastButtonPos[1]), Settings.touchSettings.blastButtonSize); + this.setEnabled(false); + } +} diff --git a/src/touch/TouchInput.hx b/src/touch/TouchInput.hx index 18d90c8c..0b6d58b2 100644 --- a/src/touch/TouchInput.hx +++ b/src/touch/TouchInput.hx @@ -39,9 +39,8 @@ class TouchInput { public var movementInput:MovementInput; public var jumpButton:JumpButton; - public var powerupButton:PowerupButton; - + public var blastbutton:BlastButton; public var pauseButton:PauseButton; public var currentTouchState:TouchEventState; @@ -55,6 +54,7 @@ class TouchInput { this.movementInput = new MovementInput(); this.jumpButton = new JumpButton(); this.powerupButton = new PowerupButton(); + this.blastbutton = new BlastButton(); this.pauseButton = new PauseButton(); this.currentTouchState = new TouchEventState(); this.previousTouchState = new TouchEventState(); @@ -101,9 +101,11 @@ class TouchInput { currentTouchState = new TouchEventState(); } - public function showControls(parentGui:GuiControl) { + public function showControls(parentGui:GuiControl, ultra:Bool) { jumpButton.dispose(); powerupButton.dispose(); + if (ultra) + blastbutton.dispose(); movementInput.dispose(); pauseButton.dispose(); cameraInput.dispose(); @@ -111,10 +113,14 @@ class TouchInput { this.movementInput = new MovementInput(); this.jumpButton = new JumpButton(); this.powerupButton = new PowerupButton(); + if (ultra) + this.blastbutton = new BlastButton(); this.pauseButton = new PauseButton(); pauseButton.add(parentGui); jumpButton.add(parentGui); powerupButton.add(parentGui); + if (ultra) + blastbutton.add(parentGui); movementInput.add(parentGui); cameraInput.add(parentGui); cameraInput.enabled = true; @@ -123,6 +129,8 @@ class TouchInput { public function setControlsEnabled(enabled:Bool) { this.jumpButton.setVisible(enabled); this.powerupButton.setVisible(enabled); + if (this.blastbutton != null) + this.blastbutton.setVisible(enabled); this.movementInput.setVisible(enabled); this.pauseButton.setVisible(enabled); this.cameraInput.enabled = enabled; @@ -131,6 +139,8 @@ class TouchInput { public function hideControls(parentGui:GuiControl) { jumpButton.remove(parentGui); powerupButton.remove(parentGui); + if (this.blastbutton != null) + blastbutton.remove(parentGui); movementInput.remove(parentGui); pauseButton.remove(parentGui); cameraInput.remove(parentGui);