diff --git a/SPD-classes/src/main/java/com/watabou/input/InputHandler.java b/SPD-classes/src/main/java/com/watabou/input/InputHandler.java index f9630f421..2870e4321 100644 --- a/SPD-classes/src/main/java/com/watabou/input/InputHandler.java +++ b/SPD-classes/src/main/java/com/watabou/input/InputHandler.java @@ -133,11 +133,13 @@ public class InputHandler extends InputAdapter { @Override public boolean touchCancelled(int screenX, int screenY, int pointer, int button) { - //currently emulating functionality from libGDX 1.11.0, do we keep this? - //in particular this is probably a more graceful way to handle things like system swipes on iOS - //whereas previously they generated garbage inputs sometimes - //which were then fixed in v2.2.2 - return touchUp(screenX, screenY, pointer, button); + + if (button >= 3 && KeyBindings.isKeyBound( button + 1000 )) { + KeyEvent.addKeyEvent( new KeyEvent( button + 1000, false ) ); + } else if (button < 3) { + PointerEvent.addPointerEvent(new PointerEvent(screenX, screenY, pointer, PointerEvent.Type.CANCEL, button)); + } + return true; } @Override diff --git a/SPD-classes/src/main/java/com/watabou/input/PointerEvent.java b/SPD-classes/src/main/java/com/watabou/input/PointerEvent.java index d9dfae076..75ba56f34 100644 --- a/SPD-classes/src/main/java/com/watabou/input/PointerEvent.java +++ b/SPD-classes/src/main/java/com/watabou/input/PointerEvent.java @@ -35,6 +35,7 @@ public class PointerEvent { public enum Type { DOWN, UP, + CANCEL, HOVER } @@ -82,6 +83,11 @@ public class PointerEvent { return this; } + public PointerEvent cancel() { + if (type == Type.DOWN) type = Type.CANCEL; + return this; + } + public PointerEvent handle(){ handled = true; return this; @@ -162,9 +168,12 @@ public class PointerEvent { pointerSignal.dispatch( null ); } else if (p.type == Type.DOWN) { pointerSignal.dispatch( existing ); - } else { + } else if (p.type == Type.UP){ activePointers.remove(existing.id); pointerSignal.dispatch(existing.up()); + } else if (p.type == Type.CANCEL){ + activePointers.remove(existing.id); + pointerSignal.dispatch(existing.cancel()); } } else { if (p.type == Type.DOWN) { @@ -185,12 +194,4 @@ public class PointerEvent { } } - public static synchronized void clearPointerEvents(){ - pointerEvents.clear(); - for (PointerEvent p : activePointers.values()){ - p.current = p.start = new PointF(-1, -1); - pointerSignal.dispatch(p.up()); - } - activePointers.clear(); - } } diff --git a/SPD-classes/src/main/java/com/watabou/noosa/Game.java b/SPD-classes/src/main/java/com/watabou/noosa/Game.java index 7a03be3cd..5289d67c9 100644 --- a/SPD-classes/src/main/java/com/watabou/noosa/Game.java +++ b/SPD-classes/src/main/java/com/watabou/noosa/Game.java @@ -33,7 +33,6 @@ import com.watabou.glwrap.Blending; import com.watabou.glwrap.Vertexbuffer; import com.watabou.input.ControllerHandler; import com.watabou.input.InputHandler; -import com.watabou.input.PointerEvent; import com.watabou.noosa.audio.Music; import com.watabou.noosa.audio.Sample; import com.watabou.utils.Callback; @@ -146,10 +145,7 @@ public class Game implements ApplicationListener { } } - ///justResumed is used for two purposes: - //firstly, to clear pointer events when the game is resumed, - // this helps with input errors caused by system gestures on iOS/Android - //secondly, as a bit of a hack to improve start time metrics on Android, + //justResumed is a bit of a hack to improve start time metrics on Android, // as texture refreshing leads to slow warm starts. TODO would be nice to fix this properly private boolean justResumed = true; @@ -162,7 +158,6 @@ public class Game implements ApplicationListener { } if (justResumed){ - PointerEvent.clearPointerEvents(); justResumed = false; if (DeviceCompat.isAndroid()) return; } @@ -180,8 +175,6 @@ public class Game implements ApplicationListener { @Override public void pause() { - PointerEvent.clearPointerEvents(); - if (scene != null) { scene.onPause(); } diff --git a/SPD-classes/src/main/java/com/watabou/noosa/PointerArea.java b/SPD-classes/src/main/java/com/watabou/noosa/PointerArea.java index ea33b0829..82c4f60ae 100644 --- a/SPD-classes/src/main/java/com/watabou/noosa/PointerArea.java +++ b/SPD-classes/src/main/java/com/watabou/noosa/PointerArea.java @@ -81,7 +81,16 @@ public class PointerArea extends Visual implements Signal.Listener curEvent = null; onClick( event ); } - + + //similar to up, but no click + } else if (event.type == PointerEvent.Type.CANCEL) { + + onPointerUp( event ); + + if (curEvent == event) { + curEvent = null; + } + } else if (event.type == PointerEvent.Type.HOVER) { if (event.handled && hovered){ hovered = false; @@ -100,7 +109,8 @@ public class PointerArea extends Visual implements Signal.Listener if (event == null && curEvent != null) { onDrag(curEvent); - } else if (curEvent != null && event.type == PointerEvent.Type.UP) { + } else if (curEvent != null && + (event.type == PointerEvent.Type.UP || event.type == PointerEvent.Type.CANCEL)) { onPointerUp( event ); curEvent = null; diff --git a/ios/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ios/IOSLauncher.java b/ios/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ios/IOSLauncher.java index b5a58a2af..3e2c7da68 100644 --- a/ios/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ios/IOSLauncher.java +++ b/ios/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ios/IOSLauncher.java @@ -45,7 +45,6 @@ import org.robovm.apple.foundation.NSString; import org.robovm.apple.glkit.GLKViewDrawableColorFormat; import org.robovm.apple.glkit.GLKViewDrawableDepthFormat; import org.robovm.apple.uikit.UIApplication; -import org.robovm.apple.uikit.UIRectEdge; import java.io.File; @@ -102,12 +101,6 @@ public class IOSLauncher extends IOSApplication.Delegate { config.hideHomeIndicator = SPDSettings.fullscreen(); config.overrideRingerSwitch = SPDSettings.ignoreSilentMode(); - //game has to ignore input from system gestures itself, otherwise there is lag on - //every button press on the corner of the screen. Currently this is accomplished via - //clearing all pointer events on the first frame after the game is resumed. - //TODO this may not be needed anymore with libgdx 1.12.1 - config.screenEdgesDeferringSystemGestures = UIRectEdge.All; - CGRect statusBarFrame = UIApplication.getSharedApplication().getStatusBarFrame(); double statusBarHeight = Math.min(statusBarFrame.getWidth(), statusBarFrame.getHeight());