From f808e201f31ac69cf613b867e50a3f8ef0dc4cfa Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Mon, 16 Sep 2019 00:00:09 -0400 Subject: [PATCH] v0.7.5: game camera now pans instead of snapping in most cases --- .../main/java/com/watabou/noosa/Camera.java | 49 +++++++++++++++---- .../shatteredpixeldungeon/journal/Notes.java | 3 +- .../scenes/CellSelector.java | 4 +- .../scenes/GameScene.java | 2 +- .../sprites/HeroSprite.java | 4 +- .../ui/DangerIndicator.java | 3 +- .../shatteredpixeldungeon/ui/ScrollPane.java | 2 +- .../shatteredpixeldungeon/ui/StatusPane.java | 4 +- 8 files changed, 48 insertions(+), 23 deletions(-) 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 2f89db24f..3cb688a7a 100644 --- a/SPD-classes/src/main/java/com/watabou/noosa/Camera.java +++ b/SPD-classes/src/main/java/com/watabou/noosa/Camera.java @@ -52,7 +52,6 @@ public class Camera extends Gizmo { public float[] matrix; public PointF scroll; - public Visual target; private float shakeMagX = 10f; private float shakeMagY = 10f; @@ -130,7 +129,7 @@ public class Camera extends Gizmo { @Override public void destroy() { - target = null; + panIntensity = 0f; } public void zoom( float value ) { @@ -145,7 +144,7 @@ public class Camera extends Gizmo { width = (int)(screenWidth / zoom); height = (int)(screenHeight / zoom); - focusOn( fx, fy ); + snapTo( fx, fy ); } public void resize( int width, int height ) { @@ -155,12 +154,28 @@ public class Camera extends Gizmo { screenHeight = (int)(height * zoom); } + Visual followTarget = null; + PointF panTarget; + //camera moves at a speed such that it will pan to its current target in 1/intensity seconds + //keep in mind though that this speed is constantly decreasing, so actual pan time is higher + float panIntensity = 0f; + @Override public void update() { super.update(); - if (target != null) { - focusOn( target.x + target.width / 2, target.y + target.height / 2 ); + if (followTarget != null){ + panTarget = followTarget.center(); + } + + if (panIntensity > 0f){ + PointF panMove = new PointF(); + panMove.x = panTarget.x - (scroll.x + width/2f); + panMove.y = panTarget.y - (scroll.y + height/2f); + + panMove.scale(Game.elapsed * panIntensity); + + scroll.offset(panMove); } if ((shakeTime -= Game.elapsed) > 0) { @@ -183,16 +198,30 @@ public class Camera extends Gizmo { return x >= this.x && y >= this.y && x < this.x + screenWidth && y < this.y + screenHeight; } - public void focusOn( float x, float y ) { + public void shift( PointF point ){ + scroll.offset(point); + panIntensity = 0f; + } + + public void snapTo(float x, float y ) { scroll.set( x - width / 2, y - height / 2 ); + panIntensity = 0f; + followTarget = null; } - public void focusOn( PointF point ) { - focusOn( point.x, point.y ); + public void snapTo(PointF point ) { + snapTo( point.x, point.y ); } - public void focusOn( Visual visual ) { - focusOn( visual.center() ); + public void panTo( PointF dst, float intensity ){ + panTarget = dst; + panIntensity = intensity; + followTarget = null; + } + + public void panFollow(Visual target, float intensity ){ + followTarget = target; + panIntensity = intensity; } public PointF screenToCamera( int x, int y ) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/journal/Notes.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/journal/Notes.java index 76d56550f..f5cd05dc3 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/journal/Notes.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/journal/Notes.java @@ -224,8 +224,9 @@ public class Notes { k = (KeyRecord) records.get(records.indexOf(k)); k.quantity(k.quantity() - key.quantity()); if (k.quantity() <= 0){ - return records.remove(k); + records.remove(k); } + return true; } return false; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/CellSelector.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/CellSelector.java index 8509231d7..2c952fe33 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/CellSelector.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/CellSelector.java @@ -160,8 +160,6 @@ public class CellSelector extends PointerArea { @Override protected void onDrag( PointerEvent event ) { - - camera.target = null; if (pinching) { @@ -180,7 +178,7 @@ public class CellSelector extends PointerArea { lastPos.set( event.current ); } else if (dragging) { - camera.scroll.offset( PointF.diff( lastPos, event.current ).invScale( camera.zoom ) ); + camera.shift( PointF.diff( lastPos, event.current ).invScale( camera.zoom ) ); lastPos.set( event.current ); } } 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 6bc056680..92dd6bfca 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java @@ -413,7 +413,7 @@ public class GameScene extends PixelScene { Dungeon.hero.next(); - Camera.main.target = hero; + Camera.main.snapTo(hero.center()); if (InterlevelScene.mode != InterlevelScene.Mode.NONE) { if (Dungeon.depth == Statistics.deepestFloor diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/HeroSprite.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/HeroSprite.java index 929068cb7..467e46dca 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/HeroSprite.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/HeroSprite.java @@ -96,7 +96,7 @@ public class HeroSprite extends CharSprite { @Override public void place( int p ) { super.place( p ); - Camera.main.target = this; + Camera.main.panTo(center(), 5f); } @Override @@ -105,7 +105,7 @@ public class HeroSprite extends CharSprite { if (ch.flying) { play( fly ); } - Camera.main.target = this; + Camera.main.panFollow(this, 5f); } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/DangerIndicator.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/DangerIndicator.java index 37e3a7b10..9f5b61ba5 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/DangerIndicator.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/DangerIndicator.java @@ -105,8 +105,7 @@ public class DangerIndicator extends Tag { TargetHealthIndicator.instance.target(target == TargetHealthIndicator.instance.target() ? null : target); if (Dungeon.hero.curAction == null) { - Camera.main.target = null; - Camera.main.focusOn(target.sprite); + Camera.main.panTo(target.sprite.center(), 5f); } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ScrollPane.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ScrollPane.java index 225b6ea09..bde3a2cb7 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ScrollPane.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ScrollPane.java @@ -140,7 +140,7 @@ public class ScrollPane extends Component { Camera c = content.camera; - c.scroll.offset( PointF.diff( lastPos, event.current ).invScale( c.zoom ) ); + c.shift( PointF.diff( lastPos, event.current ).invScale( c.zoom ) ); if (c.scroll.x + width > content.width()) { c.scroll.x = content.width() - width; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java index 17186dc68..84a89a42b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java @@ -86,9 +86,7 @@ public class StatusPane extends Component { @Override protected void onClick( PointerEvent event ) { Image sprite = Dungeon.hero.sprite; - if (!sprite.isVisible()) { - Camera.main.focusOn( sprite ); - } + Camera.main.panTo( sprite.center(), 2f ); GameScene.show( new WndHero() ); } } );