From d610383717a5794acc55400fbf186a7c8dfa777e Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Fri, 25 Jun 2021 15:54:04 -0400 Subject: [PATCH] v0.9.4: added main code module support for iOS --- .../src/main/java/com/watabou/noosa/Game.java | 7 +++++-- .../main/java/com/watabou/noosa/NoosaScript.java | 4 ++-- .../main/java/com/watabou/utils/DeviceCompat.java | 15 +++++++++++++-- .../java/com/watabou/utils/PlatformSupport.java | 8 +++++++- .../ShatteredPixelDungeon.java | 11 +++++++++++ .../windows/WndSettings.java | 2 +- 6 files changed, 39 insertions(+), 8 deletions(-) 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 21b2311d5..7afc71419 100644 --- a/SPD-classes/src/main/java/com/watabou/noosa/Game.java +++ b/SPD-classes/src/main/java/com/watabou/noosa/Game.java @@ -52,7 +52,10 @@ public class Game implements ApplicationListener { // Size of the EGL surface view public static int width; public static int height; - + + //number of pixels from bottom of view before rendering starts + public static int bottomInset; + // Density: mdpi=1, hdpi=1.5, xhdpi=2... public static float density = 1; @@ -299,7 +302,7 @@ public class Game implements ApplicationListener { } public static void vibrate( int milliseconds ) { - Gdx.input.vibrate(milliseconds); + platform.vibrate( milliseconds ); } public interface SceneChangeCallback{ diff --git a/SPD-classes/src/main/java/com/watabou/noosa/NoosaScript.java b/SPD-classes/src/main/java/com/watabou/noosa/NoosaScript.java index b6983bfbc..784084736 100644 --- a/SPD-classes/src/main/java/com/watabou/noosa/NoosaScript.java +++ b/SPD-classes/src/main/java/com/watabou/noosa/NoosaScript.java @@ -167,11 +167,11 @@ public class NoosaScript extends Script { // because for some reason all other openGL operations work on virtual pixels // but glScissor operations work on real pixels float xScale = (Gdx.graphics.getBackBufferWidth() / (float)Game.width ); - float yScale = (Gdx.graphics.getBackBufferHeight() / (float)Game.height ); + float yScale = ((Gdx.graphics.getBackBufferHeight()-Game.bottomInset) / (float)Game.height ); Gdx.gl20.glScissor( Math.round(camera.x * xScale), - Math.round((Game.height - camera.screenHeight - camera.y) * yScale), + Math.round((Game.height - camera.screenHeight - camera.y) * yScale) + Game.bottomInset, Math.round(camera.screenWidth * xScale), Math.round(camera.screenHeight * yScale)); } else { diff --git a/SPD-classes/src/main/java/com/watabou/utils/DeviceCompat.java b/SPD-classes/src/main/java/com/watabou/utils/DeviceCompat.java index 7827c91a7..5df7dcf4a 100644 --- a/SPD-classes/src/main/java/com/watabou/utils/DeviceCompat.java +++ b/SPD-classes/src/main/java/com/watabou/utils/DeviceCompat.java @@ -32,14 +32,25 @@ public class DeviceCompat { public static boolean supportsFullScreen(){ switch (Gdx.app.getType()){ case Android: - //Android 4.4 KitKat and later, this is for immersive mode + //Android 4.4+ supports hiding UI via immersive mode return Gdx.app.getVersion() >= 19; + case iOS: + //iOS supports hiding UI via drawing into the gesture safe area + return Gdx.graphics.getSafeInsetBottom() != 0; default: //TODO implement functionality for other platforms here return true; } } - + + public static boolean isAndroid(){ + return Gdx.app.getType() == Application.ApplicationType.Android; + } + + public static boolean isiOS(){ + return Gdx.app.getType() == Application.ApplicationType.iOS; + } + public static boolean isDesktop(){ return Gdx.app.getType() == Application.ApplicationType.Desktop; } diff --git a/SPD-classes/src/main/java/com/watabou/utils/PlatformSupport.java b/SPD-classes/src/main/java/com/watabou/utils/PlatformSupport.java index 6478b528a..b28015469 100644 --- a/SPD-classes/src/main/java/com/watabou/utils/PlatformSupport.java +++ b/SPD-classes/src/main/java/com/watabou/utils/PlatformSupport.java @@ -21,6 +21,7 @@ package com.watabou.utils; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.g2d.BitmapFont; public abstract class PlatformSupport { @@ -39,7 +40,12 @@ public abstract class PlatformSupport { public static abstract class TextCallback { public abstract void onSelect( boolean positive, String text ); } - + + public void vibrate( int millis ){ + //regular GDX vibration by default + Gdx.input.vibrate( millis ); + } + //TODO should consider spinning this into its own class, rather than platform support getting ever bigger public abstract void setupFontGenerators(int pageSize, boolean systemFont ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java index 219361368..957ee81f9 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java @@ -27,6 +27,7 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.WelcomeScene; import com.watabou.noosa.Game; import com.watabou.noosa.audio.Music; import com.watabou.noosa.audio.Sample; +import com.watabou.utils.DeviceCompat; import com.watabou.utils.PlatformSupport; public class ShatteredPixelDungeon extends Game { @@ -122,6 +123,16 @@ public class ShatteredPixelDungeon extends Game { } + @Override + public void finish() { + if (!DeviceCompat.isiOS()) { + super.finish(); + } else { + //can't exit on iOS (Apple guidelines), so just go to title screen + switchScene(TitleScene.class); + } + } + public static void switchNoFade(Class c){ switchNoFade(c, null); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java index 2081f7ba5..887ae3356 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java @@ -223,7 +223,7 @@ public class WndSettings extends WndTabbed { add(optScale); } - if (!DeviceCompat.isDesktop() && PixelScene.maxScreenZoom >= 2) { + if (DeviceCompat.isAndroid() && PixelScene.maxScreenZoom >= 2) { chkSaver = new CheckBox(Messages.get(this, "saver")) { @Override protected void onClick() {