From 2706d9fd45d1c0cb366dd0f489978ffebb70a36d Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Sat, 6 Aug 2022 00:00:25 +0530 Subject: [PATCH] powerup and jump touch controls --- data/ui/touch/energy.png | Bin 0 -> 4905 bytes data/ui/touch/up-arrow.png | Bin 0 -> 3960 bytes src/CameraController.hx | 5 +- src/Marble.hx | 4 +- src/MarbleGame.hx | 3 +- src/MarbleWorld.hx | 2 + src/Settings.hx | 4 +- src/gui/GuiGraphics.hx | 51 +++++++++++++++++ src/gui/PlayGui.hx | 2 + src/touch/CameraInput.hx | 25 ++++---- src/touch/JumpButton.hx | 13 +++++ src/touch/PowerupButton.hx | 14 +++++ src/touch/TouchButton.hx | 113 +++++++++++++++++++++++++++++++++++++ src/touch/TouchInput.hx | 35 ++++++++++-- 14 files changed, 249 insertions(+), 22 deletions(-) create mode 100644 data/ui/touch/energy.png create mode 100644 data/ui/touch/up-arrow.png create mode 100644 src/gui/GuiGraphics.hx create mode 100644 src/touch/JumpButton.hx create mode 100644 src/touch/PowerupButton.hx create mode 100644 src/touch/TouchButton.hx diff --git a/data/ui/touch/energy.png b/data/ui/touch/energy.png new file mode 100644 index 0000000000000000000000000000000000000000..635d6d177d64b0e0614b65eac96f23489061aae0 GIT binary patch literal 4905 zcmeI0i8s_y8^^~IhM_U3jCFpQ$eOVvTbUWAnJg6|l6}pRwUNp?7@-Csq!L+btTT2} z_BDgZUJV9?vR8_C-oN90?>YB8_c`a@=eeKndCq;#xe1reE(r3A@q<7hK?2^;90cNI zFF8ScTx`=;i0oz?t{@D-l8=vX>g%O1Y!~d0w+RA)E}#1Er0MY;nsy znCKMf1|kxPDqeoxK`u`IZYs9|J#yCc#Mp5_mrX2<4h|03`~N@wufYGN0s=C%U)kgb z!RBTbAP!D0?n6Ahd|-Y7h@jA6s4(n^$kAiRMd4!N5|UEV2;hVa@}#WXDR~7&C1sV< zswg#e4b3xJXSH>7_4Lo3H$Y>shDNvxc)~?v6H~KGm#>&xSYEZVzGh>4-R_3HgQJtP zi>sTvho{#~Zy#U3TmAuoLBS!niJ^DG?%ul}9uXN89YczZizg>MNK8t8_=u8{n)Wz7 zBlAgCcFxn>XU|{cz05CoRajJ9^7;+6w5+_MvWiBpuBol7Z)j|4e%tcyeQR5LM`u@e zPj6rUz=uJ`(D2B|(XmhC6O&WZGqaz+d}YqfFR&JumcM;pSzY__bA4lTYkOz+*Y7`j zfB)@&=bO+3frKaoL$swReD(d^7oRr&@%~)goi<;zT>3U^G%(%Zsg7Gv%NMAE%ln)` zqIMtLfPmEtF*$j#GuVY1_zgSv;3GAU{hq8PmVJ9V^7~xGfls)~;z#Ypz3`Uv<-3b} z_w*tyLu0Q@g@cgCO%>qPdw}+GSF!IDZ)#d)(qt}WTFIsVOiko`flU5weWX^Vs=K#1 zHgHqP<@O<@mSByl^TF())SNj{+H-@zU~!q63TSG6t!U*4pgkEQoRbzczhsA7X{6Zc zw}uWx&cAk4o(thdTF;1<7a_D89}d0N;ZCJx!b=kvgTpmls)UB(z(EoWu z<+3f+a1oJp0SYd3Uum-Vt{RSLAYs$X=j$UBkk923tlypjBrzsCp%nhVltPam_vdEDk<_G%{$f}tK#?!krFr#)1s;D?cC zgGBSy4>3PfCz+1EhZ60beWar6M(UzdN<0Mu7DYN)eq`*fs@ip1tb}cA_cSD+m`i4J zy$l*3r>fS5P|+W#qxx_M6uTaoQxjzlqmuekoyo?vsw!Lvv*w=SrW>GulB*e4mIVU7 z`QR2b$=8p-)1{zAYTlx0Etu(Vy-!>lG1Fonp6Kxe`0&V7HOsV@b{Eu_Vj)=p8JS!h%01YXnh{&e4*R^sQ)JJ z%W3GP235`p73ifn6lX;AFSXpAtG7v^=2qyvwU}SSnLEBS;>GqQ?G@he`(~_B**`!ji2!#JwgEWQQ5A38pjILB?~! z20G|IQcGFOJoB_FPWy{(5<4TiELofx|DJQ7>2uUOD~g0CZXv|Vt7QF zCu1XyqWa(r;{}>x@URe__y7?#Z5Z3G3xSs~VzdSbjFG0nGRGSjiF@|#ououQe2F?wA_dF%W;yVIy^i^63&PAd6|&Wi zz$_ys10|5f0U8TN_-l%uy;=ZT@}k8v5-CJexkLvF8%w0SN+7AYDNp?Ga7snkQ0f)R zyS0}<&UFmubpxy)iF+(Aj_S=1Uf~oA)I`$dyt>%H?;ebeJQM)(B#m^B9YtdrQ*Lj? zb8Dr!_xBlKyseDX!_d*XY3@y&;2-Gh01;%<0-b4t4~=I$@R7rZS`R(A0DwcIaF%O_ z!R13|#8AglBkeVqBl-ZiE)h4)LuloktOzIKId}4f&&MFYvb_e8RFa%$+barEq_hb9 zBhw)Dr|+b{3Q|~$L5etP09)rVUE(De(iCie@*v?J4ALB;Cp7X{6Ca^F(DtVwUQH

=757Acvg-g@H~iXv){0LvHAU9wIX0X z=ytiYy$$X3{N@Ko`;rxo-_g8Jtm6#cF3GUcco7c4s+&FE1=;rGW_PbX;IN^^dbA+} zI1KwMZg%~qoYqbGJ!ju-J>Ao^ei1dV$WnLs+jw+damVfL_@v;*)kSrOr(7kSbNxqJ zVlDH39%03o7*TFY^!%-$Y8U9VINOg8!_7-SWgY)Ovh?0nV8vVqM)x>2-#Z8(MjM~s zaUAlah}~=7nhJ&%@bIGkRsBO~)<-WBxe9QD>f6tH4Q{gUF|sxzOA*WMreFUoY);e7 z3cT73=&C-KCrY~V?l|@83r(c#WNK?9vzjdU!K|aUv@%KL6WMeP_dO!w>sG#|HJVe* z*hMOiL{F;e_vHf@%lNYOKo%H#U39yIzdShn*cgG<9LE?-vCB|G`A$9uk~-zt-P??a zYBtjCeMI7};T5b0!6xhJE=tI{3!a^CIw%bOvEc`gY|+u*af&tJT(H>?I@1o%Xnzd7-0&+<4Di8080 zSM{{oWk)>bq1#4P5jr(cF^wpLL~TB)D^jNv(A}BGG@_6!J6YehPl%p7ByitO6jF|s z0p5cn(KAmfy3{G$H@aM#EqDmSeI_5fRsq6I^B$z{d5+X#i>%@|Ku<#^A&fh<;*|+w zI*#HR;ut-)#!DE7$`)10A-x7wwKFlPR#jOEa9+Z6rAdE352bykw}3h+klJ*|1m95$ z^mymGVN^(>{z6AKbjgPftHaAP3?SW9rxWLH3RZqmm35xd0%Yy_4F5u%+l)v89) zS#~5#cBxjZ>>}c(Ti^LbU)zvv3u^#5N7b0(IC$K#*oFi9jJ?#wd#}CKQL77*spe6s6{EB%~S2qPC^z2aL}L~ zk5k^eG2=lft`a>SXNCo2z6cs~@eC>{0GjyFNmQK}buCyR=32E@dw~`l({TlwX6puT zMUYKB)JdPQN!i_?eS6MId0O_q@-0EsYsG(4x6ih}{<`(!0+i;?XdHsl#H<;$a3d(q ztnijJJ#swcu>KxhvAyEt)`}9@X>Wu!1!UYXY1y~pt6Y%}t9B)l-8yoXMp#%x;dX)b z=lJn6sppa-MYS@e^esS@rB^fdm3;V7eu#e){-E}T_$AXFS8_vIA?@s7bLd~Ojxa1LZMo+%9)_r-}h~fz;2--z6 z*P%D=mU6?A`)}&h+&hfdYhYCR#$!*YB|XgLP3Q@3(By%oRq^X=n+qdl?=OGkRYqKa zV>8dK@+b5;H)w!hnLEMDT9j@`A@;Ng=7f6en$nCUEQ^^O?7j(5#D>5Lz=gc%wh;W{8xsHY&v2|01)rS96%pNjQ#eSgTo`G-`lRuI9^3xy1j}bHfZ}QD z{y`<)@J*;pkR}JLe64?U{!RQ`-o+=#E{EFlBp^KG-^yDARlz>`RD49vgD zj@I!=hY`waL8fB{? zTNlL^qoXjeYm7)LxaOrzEPj0)IS>}qRTf(?d1{UE99XWQ=x*GWM~+VVUtsstf~nZ) zD7F~pYlO9T>6FKclkc)kNd+@ks1r})DD=h@O{ENV zD0-?7HA9;@kcX*`+g5Af9^>;L;f NK`=5iEW|_3 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 eM+#DBUHJlDtWYF6U3_`Vx6@`erWMCs!? literal 0 HcmV?d00001 diff --git a/src/CameraController.hx b/src/CameraController.hx index badb11f5..ecf8e07c 100644 --- a/src/CameraController.hx +++ b/src/CameraController.hx @@ -106,7 +106,7 @@ class CameraController extends Object { #end } - public function orbit(mouseX:Float, mouseY:Float) { + public function orbit(mouseX:Float, mouseY:Float, isTouch:Bool = false) { var scaleFactor = 1.0; #if js scaleFactor = 1 / js.Browser.window.devicePixelRatio; @@ -118,7 +118,8 @@ class CameraController extends Object { deltaposY = 0; } - var factor = Util.lerp(1 / 2500, 1 / 100, Settings.controlsSettings.cameraSensitivity); + var factor = isTouch ? Util.lerp(1 / 1500, 1 / 50, + Settings.controlsSettings.cameraSensitivity) : Util.lerp(1 / 2500, 1 / 100, Settings.controlsSettings.cameraSensitivity); CameraPitch += deltaposY * factor; CameraYaw += deltaposX * factor; diff --git a/src/Marble.hx b/src/Marble.hx index c2fd1010..c7bfacef 100644 --- a/src/Marble.hx +++ b/src/Marble.hx @@ -1344,10 +1344,10 @@ class Marble extends GameObject { if (Key.isDown(Settings.controlsSettings.right)) { move.d.y -= 1; } - if (Key.isDown(Settings.controlsSettings.jump)) { + if (Key.isDown(Settings.controlsSettings.jump) || MarbleGame.instance.touchInput.jumpButton.pressed) { move.jump = true; } - if (Key.isDown(Settings.controlsSettings.powerup)) { + if (Key.isDown(Settings.controlsSettings.powerup) || MarbleGame.instance.touchInput.powerupButton.pressed) { move.powerup = true; } } diff --git a/src/MarbleGame.hx b/src/MarbleGame.hx index 58ddba49..cf6b500c 100644 --- a/src/MarbleGame.hx +++ b/src/MarbleGame.hx @@ -144,8 +144,9 @@ class MarbleGame { handlePauseGame(); #end #if js - if (paused) + if (paused) { paused = false; + } handlePauseGame(); #end } diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index 177da58e..129a4cf8 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -1037,12 +1037,14 @@ class MarbleWorld extends Scheduler { return false; this.marble.heldPowerup = powerUp; this.playGui.setPowerupImage(powerUp.identifier); + MarbleGame.instance.touchInput.powerupButton.setEnabled(true); return true; } public function deselectPowerUp() { this.marble.heldPowerup = null; this.playGui.setPowerupImage(""); + MarbleGame.instance.touchInput.powerupButton.setEnabled(false); } /** Get the current interpolated orientation quaternion. */ diff --git a/src/Settings.hx b/src/Settings.hx index bd4cc9c8..396ae897 100644 --- a/src/Settings.hx +++ b/src/Settings.hx @@ -217,8 +217,8 @@ class Settings { Settings.optionsSettings.screenHeight = cast wnd.height / zoomRatio; #end #if js - Settings.optionsSettings.screenWidth = cast js.Browser.window.screen.width * js.Browser.window.devicePixelRatio; // 1024; // cast(js.Browser.window.innerWidth / js.Browser.window.innerHeight) * 768; // cast js.Browser.window.innerWidth * js.Browser.window.devicePixelRatio * 0.5; - Settings.optionsSettings.screenHeight = cast js.Browser.window.screen.height * js.Browser.window.devicePixelRatio; // 768; // cast js.Browser.window.innerHeight * js.Browser.window.devicePixelRatio * 0.5; + Settings.optionsSettings.screenWidth = cast js.Browser.window.screen.width; // 1024; // cast(js.Browser.window.innerWidth / js.Browser.window.innerHeight) * 768; // cast js.Browser.window.innerWidth * js.Browser.window.devicePixelRatio * 0.5; + Settings.optionsSettings.screenHeight = cast js.Browser.window.screen.height; // 768; // cast js.Browser.window.innerHeight * js.Browser.window.devicePixelRatio * 0.5; var canvasElement = js.Browser.document.getElementById("webgl"); canvasElement.style.width = "100%"; diff --git a/src/gui/GuiGraphics.hx b/src/gui/GuiGraphics.hx new file mode 100644 index 00000000..2d5fb1a4 --- /dev/null +++ b/src/gui/GuiGraphics.hx @@ -0,0 +1,51 @@ +package gui; + +import h2d.Graphics; +import gui.GuiControl.MouseState; +import h2d.Scene; +import h2d.Tile; +import h2d.Bitmap; +import src.MarbleGame; + +@:publicFields +class GuiGraphics extends GuiControl { + var graphics:Graphics; + + public var pressedAction:GuiControl->Void = null; + + public function new(graphics:Graphics) { + super(); + this.graphics = graphics; + } + + public override function render(scene2d:Scene) { + var renderRect = this.getRenderRectangle(); + graphics.setPosition(Math.floor(renderRect.position.x), Math.floor(renderRect.position.y)); + // bmp.scaleX = renderRect.extent.x / bmp.tile.width; + // bmp.scaleY = renderRect.extent.y / bmp.tile.height; + if (scene2d.contains(graphics)) { + scene2d.removeChild(graphics); // Refresh "layer" + } + scene2d.addChild(graphics); + super.render(scene2d); + } + + public override function dispose() { + super.dispose(); + this.graphics.remove(); + } + + public override function onMouseRelease(mouseState:MouseState) { + super.onMouseRelease(mouseState); + if (this.pressedAction != null) { + this.pressedAction(this); + } + } + + public override function onRemove() { + super.onRemove(); + if (MarbleGame.canvas.scene2d.contains(graphics)) { + MarbleGame.canvas.scene2d.removeChild(graphics); // Refresh "layer" + } + } +} diff --git a/src/gui/PlayGui.hx b/src/gui/PlayGui.hx index 21f2b7a2..5ae447a9 100644 --- a/src/gui/PlayGui.hx +++ b/src/gui/PlayGui.hx @@ -130,6 +130,8 @@ class PlayGui { initPowerupBox(); initTexts(); + MarbleGame.instance.touchInput.showControls(this.playGuiCtrl); + playGuiCtrl.render(scene2d); resizeEv = () -> { diff --git a/src/touch/CameraInput.hx b/src/touch/CameraInput.hx index f056b304..f6df4062 100644 --- a/src/touch/CameraInput.hx +++ b/src/touch/CameraInput.hx @@ -20,20 +20,25 @@ class CameraInput { doing = true; } } - } else { + } + if (doing) { // Get our identifier for (touch in touchState.changedTouches) { - if (touch.identifier == this.identifier && touch.state == Release) { - doing = false; - return; // lol - } - if (touch.identifier == this.identifier && touch.state == Move) { - MarbleGame.instance.world.marble.camera.orbit(touch.deltaPosition.x, touch.deltaPosition.y); - return; + if (touch.identifier == this.identifier) { + switch (touch.state) { + case Release: + doing = false; + return; + + case Move: + MarbleGame.instance.world.marble.camera.orbit(touch.deltaPosition.x, touch.deltaPosition.y); + return; + + case _: + return; + } } } - // Could not find - doing = false; } } } diff --git a/src/touch/JumpButton.hx b/src/touch/JumpButton.hx new file mode 100644 index 00000000..5586fba7 --- /dev/null +++ b/src/touch/JumpButton.hx @@ -0,0 +1,13 @@ +package touch; + +import touch.TouchInput.Touch; +import h3d.Vector; +import hxd.Window; +import src.ResourceLoader; +import src.Settings; + +class JumpButton extends TouchButton { + public function new() { + super(ResourceLoader.getImage("data/ui/touch/up-arrow.png").resource, new Vector(440, 320), 60); + } +} diff --git a/src/touch/PowerupButton.hx b/src/touch/PowerupButton.hx new file mode 100644 index 00000000..4ec6c08b --- /dev/null +++ b/src/touch/PowerupButton.hx @@ -0,0 +1,14 @@ +package touch; + +import touch.TouchInput.Touch; +import h3d.Vector; +import hxd.Window; +import src.ResourceLoader; +import src.Settings; + +class PowerupButton extends TouchButton { + public function new() { + super(ResourceLoader.getImage("data/ui/touch/energy.png").resource, new Vector(440, 180), 60); + this.setEnabled(false); + } +} diff --git a/src/touch/TouchButton.hx b/src/touch/TouchButton.hx new file mode 100644 index 00000000..db078bb7 --- /dev/null +++ b/src/touch/TouchButton.hx @@ -0,0 +1,113 @@ +package touch; + +import src.Settings; +import gui.GuiControl; +import gui.GuiGraphics; +import touch.TouchInput.Touch; +import touch.TouchInput.TouchEventState; +import h3d.Vector; +import hxd.res.Image; +import src.MarbleGame; + +class TouchButton { + public var img:Image; + + public var guiElement:GuiGraphics; + + public var position:Vector; + + public var radius:Float; + + var doing = false; + + var added = false; + + public var pressed = false; + + public var enabled = true; + + var identifier:Int = -1; + + var collider:h2d.Interactive; + + public function new(img:Image, position:Vector, radius:Float) { + var imgTile = img.toTile(); + + var iconScale = 1.5; + + var g = new h2d.Graphics(); + g.beginFill(0xffffff); + g.drawCircle(0, 0, radius); + g.beginTileFill(-(imgTile.width * iconScale * radius / imgTile.width) / 2, -(imgTile.height * iconScale * radius / imgTile.width) / 2, + iconScale * radius / imgTile.width, iconScale * radius / imgTile.height, imgTile); + g.drawRect(-(imgTile.width * iconScale * radius / imgTile.width) / 2, -(imgTile.height * iconScale * radius / imgTile.width / 2), + (imgTile.width * iconScale * radius / imgTile.width), (imgTile.height * iconScale * radius / imgTile.width)); + g.endFill(); + // g.setPosition(position.x, position.y); + this.guiElement = new GuiGraphics(g); + this.guiElement.position = position; + this.guiElement.extent = new Vector(2 * radius, 2 * radius); + this.guiElement.horizSizing = Left; + this.guiElement.vertSizing = Top; + this.radius = radius; + + this.collider = new h2d.Interactive(2 * radius, 2 * radius, this.guiElement.graphics, new h2d.col.Circle(0, 0, radius)); + this.collider.onPush = (e) -> { + onClick(); + if (this.enabled) { + g.alpha = 0.9; + } else { + g.alpha = 0.5; + } + } + this.collider.onRelease = (e) -> { + onRelease(); + + if (this.enabled) { + g.alpha = 0.4; + } else { + g.alpha = 0.2; + } + } + + if (this.enabled) { + g.alpha = 0.4; + } else { + g.alpha = 0.2; + } + } + + public function add(parentGui:GuiControl) { + parentGui.addChild(this.guiElement); + added = true; + } + + public function remove(parentGui:GuiControl) { + parentGui.removeChild(this.guiElement); + added = false; + } + + public function setEnabled(enabled:Bool) { + this.enabled = enabled; + if (this.enabled) { + this.guiElement.graphics.alpha = 0.4; + } else { + this.guiElement.graphics.alpha = 0.2; + } + if (this.pressed) { + if (this.enabled) { + this.guiElement.graphics.alpha = 0.9; + } else { + this.guiElement.graphics.alpha = 0.5; + } + } + } + + public dynamic function onClick() { + pressed = true; + } + + public dynamic function onRelease() { + pressed = false; + } +} diff --git a/src/touch/TouchInput.hx b/src/touch/TouchInput.hx index 6bbdeb5a..59b535bb 100644 --- a/src/touch/TouchInput.hx +++ b/src/touch/TouchInput.hx @@ -1,7 +1,9 @@ package touch; +import gui.GuiControl; import src.MarbleWorld; import h3d.Vector; +import src.Settings; enum TouchState { Pressed; @@ -32,14 +34,22 @@ class TouchEventState { } class TouchInput { - public var cameraInput:CameraInput; + var cameraInput:CameraInput; + + public var jumpButton:JumpButton; + + public var powerupButton:PowerupButton; public var currentTouchState:TouchEventState; public var previousTouchState:TouchEventState; + var touches:Map = []; + public function new() { this.cameraInput = new CameraInput(); + this.jumpButton = new JumpButton(); + this.powerupButton = new PowerupButton(); this.currentTouchState = new TouchEventState(); this.previousTouchState = new TouchEventState(); } @@ -47,28 +57,33 @@ class TouchInput { // Registers the callbacks to the native stuff public function registerTouchInput() { #if js - var pointercontainer = js.Browser.document.querySelector("#pointercontainer"); + var pointercontainer = js.Browser.document.querySelector("#webgl"); pointercontainer.addEventListener('touchstart', (e:js.html.TouchEvent) -> { for (touch in e.changedTouches) { var t = new Touch(Pressed, new Vector(touch.clientX, touch.clientY), new Vector(0, 0), touch.identifier); currentTouchState.changedTouches.push(t); + touches.set(touch.identifier, t); + // trace("Touch Start"); } }); pointercontainer.addEventListener('touchmove', (e:js.html.TouchEvent) -> { for (touch in e.changedTouches) { - var prevt = previousTouchState.changedTouches.filter(x -> x.identifier == touch.identifier); + var prevt = touches.get(touch.identifier); // previousTouchState.changedTouches.filter(x -> x.identifier == touch.identifier); var prevDelta = new Vector(0, 0); - if (prevt.length != 0) { - prevDelta = new Vector(touch.clientX, touch.clientY).sub(prevt[0].position); + if (prevt != null) { + prevDelta = new Vector(touch.clientX, touch.clientY).sub(prevt.position); } var t = new Touch(Move, new Vector(touch.clientX, touch.clientY), prevDelta, touch.identifier); currentTouchState.changedTouches.push(t); + // trace("Touch Move"); } }); pointercontainer.addEventListener('touchend', (e:js.html.TouchEvent) -> { for (touch in e.changedTouches) { var t = new Touch(Release, new Vector(touch.clientX, touch.clientY), new Vector(0, 0), touch.identifier); currentTouchState.changedTouches.push(t); + touches.remove(touch.identifier); + // trace("Touch End"); } }); #end @@ -79,4 +94,14 @@ class TouchInput { previousTouchState = currentTouchState; currentTouchState = new TouchEventState(); } + + public function showControls(parentGui:GuiControl) { + jumpButton.add(parentGui); + powerupButton.add(parentGui); + } + + public function hideControls(parentGui:GuiControl) { + jumpButton.remove(parentGui); + powerupButton.remove(parentGui); + } }