diff --git a/SPD-classes/src/main/java/com/watabou/noosa/Camera.java b/SPD-classes/src/main/java/com/watabou/noosa/Camera.java index 2956f0f60..283048292 100644 --- a/SPD-classes/src/main/java/com/watabou/noosa/Camera.java +++ b/SPD-classes/src/main/java/com/watabou/noosa/Camera.java @@ -52,6 +52,7 @@ public class Camera extends Gizmo { public float[] matrix; public PointF scroll; + public PointF centerOffset; private float shakeMagX = 10f; private float shakeMagY = 10f; @@ -122,6 +123,7 @@ public class Camera extends Gizmo { screenHeight = (int)(height * zoom); scroll = new PointF(); + centerOffset = new PointF(); matrix = new float[16]; Matrix.setIdentity( matrix ); @@ -139,12 +141,15 @@ public class Camera extends Gizmo { } public void zoom( float value, float fx, float fy ) { - + + PointF offsetAdjust = centerOffset.clone(); + centerOffset.scale(zoom).invScale(value); + zoom = value; width = (int)(screenWidth / zoom); height = (int)(screenHeight / zoom); - snapTo( fx, fy ); + snapTo( fx - offsetAdjust.x, fy - offsetAdjust.y ); } public void resize( int width, int height ) { @@ -165,7 +170,7 @@ public class Camera extends Gizmo { super.update(); if (followTarget != null){ - panTarget = followTarget.center(); + panTarget = followTarget.center().offset(centerOffset); } if (panIntensity > 0f){ @@ -202,9 +207,17 @@ public class Camera extends Gizmo { scroll.offset(point); panIntensity = 0f; } + + public void setCenterOffset( float x, float y ){ + scroll.x += x - centerOffset.x; + scroll.y += y - centerOffset.y; + centerOffset.set(x, y); + panIntensity = 0f; + followTarget = null; + } public void snapTo(float x, float y ) { - scroll.set( x - width / 2, y - height / 2 ); + scroll.set( x - width / 2, y - height / 2 ).offset(centerOffset); panIntensity = 0f; followTarget = null; } @@ -214,7 +227,7 @@ public class Camera extends Gizmo { } public void panTo( PointF dst, float intensity ){ - panTarget = dst; + panTarget = dst.offset(centerOffset); panIntensity = intensity; followTarget = null; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java index b485f7cf4..b1376742e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java @@ -764,6 +764,15 @@ public class GameScene extends PixelScene { if (scene == null) return; + //move the camera center up a bit if we're on full UI and it is taking up lots of space + if (scene.inventory != null && scene.inventory.visible + && (uiCamera.width < 460 && uiCamera.height < 300)){ + Camera.main.setCenterOffset(0, Math.min(300-uiCamera.height, 460-uiCamera.width) / Camera.main.zoom); + } else { + Camera.main.setCenterOffset(0, 0); + } + //Camera.main.panTo(Dungeon.hero.sprite.center(), 5f); + //primarily for phones displays with notches //TODO Android never draws into notch atm, perhaps allow it for center notches? RectF insets = DeviceCompat.getSafeInsets();