From e2446d153e9f908842c21d25193bbee32db4175f Mon Sep 17 00:00:00 2001 From: Oskar Wiksten Date: Sun, 13 Jan 2013 13:03:13 +0100 Subject: [PATCH] Only redraw game screen when something inside the view has actually changed. --- .../controller/GameRoundController.java | 5 ++ .../listeners/GameRoundListener.java | 7 +++ .../listeners/GameRoundListeners.java | 33 ++++++++++++ .../gpl/rpg/AndorsTrail/view/MainView.java | 51 +++++++++++++------ 4 files changed, 81 insertions(+), 15 deletions(-) create mode 100644 AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/GameRoundListener.java create mode 100644 AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/GameRoundListeners.java diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/GameRoundController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/GameRoundController.java index 0c5e7c8aa..08368f78a 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/GameRoundController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/GameRoundController.java @@ -2,6 +2,7 @@ package com.gpl.rpg.AndorsTrail.controller; import com.gpl.rpg.AndorsTrail.context.ViewContext; import com.gpl.rpg.AndorsTrail.context.WorldContext; +import com.gpl.rpg.AndorsTrail.controller.listeners.GameRoundListeners; import com.gpl.rpg.AndorsTrail.util.TimedMessageTask; public final class GameRoundController implements TimedMessageTask.Callback { @@ -9,6 +10,7 @@ public final class GameRoundController implements TimedMessageTask.Callback { private final ViewContext view; private final WorldContext world; private final TimedMessageTask roundTimer; + public final GameRoundListeners gameRoundListeners = new GameRoundListeners(); public GameRoundController(ViewContext context, WorldContext world) { this.view = context; @@ -63,11 +65,13 @@ public final class GameRoundController implements TimedMessageTask.Callback { Controller.resetMapsNotRecentlyVisited(world); view.actorStatsController.applyConditionsToMonsters(world.model.currentMap, true); view.actorStatsController.applyConditionsToPlayer(world.model.player, true); + gameRoundListeners.onNewFullRound(); } public void onNewRound() { onNewMonsterRound(); onNewPlayerRound(); + gameRoundListeners.onNewRound(); } public void onNewPlayerRound() { view.actorStatsController.applyConditionsToPlayer(world.model.player, false); @@ -82,5 +86,6 @@ public final class GameRoundController implements TimedMessageTask.Callback { view.monsterSpawnController.maybeSpawn(world.model.currentMap); view.monsterMovementController.attackWithAgressiveMonsters(); view.effectController.updateSplatters(world.model.currentMap); + gameRoundListeners.onNewTick(); } } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/GameRoundListener.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/GameRoundListener.java new file mode 100644 index 000000000..de8161e3a --- /dev/null +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/GameRoundListener.java @@ -0,0 +1,7 @@ +package com.gpl.rpg.AndorsTrail.controller.listeners; + +public interface GameRoundListener { + void onNewTick(); + void onNewRound(); + void onNewFullRound(); +} diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/GameRoundListeners.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/GameRoundListeners.java new file mode 100644 index 000000000..ee11a4e16 --- /dev/null +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/GameRoundListeners.java @@ -0,0 +1,33 @@ +package com.gpl.rpg.AndorsTrail.controller.listeners; + +import com.gpl.rpg.AndorsTrail.model.listeners.ListOfListeners; + +public class GameRoundListeners extends ListOfListeners implements GameRoundListener { + + private final Function onNewTick = new Function() { + @Override public void call(GameRoundListener listener) { listener.onNewTick(); } + }; + + private final Function onNewRound = new Function() { + @Override public void call(GameRoundListener listener) { listener.onNewRound(); } + }; + + private final Function onNewFullRound = new Function() { + @Override public void call(GameRoundListener listener) { listener.onNewFullRound(); } + }; + + @Override + public void onNewTick() { + callAllListeners(this.onNewTick); + } + + @Override + public void onNewRound() { + callAllListeners(this.onNewRound); + } + + @Override + public void onNewFullRound() { + callAllListeners(this.onNewFullRound); + } +} diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/MainView.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/MainView.java index 23e3a0b94..c2ac2770e 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/MainView.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/MainView.java @@ -7,12 +7,7 @@ import com.gpl.rpg.AndorsTrail.context.WorldContext; import com.gpl.rpg.AndorsTrail.controller.InputController; import com.gpl.rpg.AndorsTrail.controller.VisualEffectController.BloodSplatter; import com.gpl.rpg.AndorsTrail.controller.VisualEffectController.VisualEffectAnimation; -import com.gpl.rpg.AndorsTrail.controller.listeners.CombatSelectionListener; -import com.gpl.rpg.AndorsTrail.controller.listeners.LootBagListener; -import com.gpl.rpg.AndorsTrail.controller.listeners.MonsterMovementListener; -import com.gpl.rpg.AndorsTrail.controller.listeners.MonsterSpawnListener; -import com.gpl.rpg.AndorsTrail.controller.listeners.PlayerMovementListener; -import com.gpl.rpg.AndorsTrail.controller.listeners.VisualEffectFrameListener; +import com.gpl.rpg.AndorsTrail.controller.listeners.*; import com.gpl.rpg.AndorsTrail.model.ModelContainer; import com.gpl.rpg.AndorsTrail.model.actor.Monster; import com.gpl.rpg.AndorsTrail.model.item.Loot; @@ -44,7 +39,8 @@ public final class MainView extends SurfaceView MonsterSpawnListener, MonsterMovementListener, LootBagListener, - VisualEffectFrameListener { + VisualEffectFrameListener, + GameRoundListener { private final int tileSize; private float scale; @@ -71,6 +67,7 @@ public final class MainView extends SurfaceView private TileCollection tiles; private final Coord playerPosition = new Coord(); private Size surfaceSize; + private boolean redrawNextTick = false; public MainView(Context context, AttributeSet attr) { super(context, attr); @@ -176,8 +173,8 @@ public final class MainView extends SurfaceView private static final int REDRAW_TILE_SELECTION_ADDED = 8; private static final int REDRAW_TILE_BAG = 9; private static final int REDRAW_TILE_SPLATTER = 12; - - private void redrawAll(int why) { + + private void redrawAll(int why) { redrawArea_(mapViewArea); } private void redrawTile(final Coord p, int why) { @@ -402,6 +399,7 @@ public final class MainView extends SurfaceView } public void subscribe() { + view.gameRoundController.gameRoundListeners.add(this); view.effectController.visualEffectFrameListeners.add(this); view.itemController.lootBagListeners.add(this); view.movementController.playerMovementListeners.add(this); @@ -416,6 +414,7 @@ public final class MainView extends SurfaceView view.movementController.playerMovementListeners.remove(this); view.itemController.lootBagListeners.remove(this); view.effectController.visualEffectFrameListeners.remove(this); + view.gameRoundController.gameRoundListeners.remove(this); } @Override @@ -438,12 +437,14 @@ public final class MainView extends SurfaceView @Override public void onMonsterSpawned(PredefinedMap map, Monster m) { if (map != currentMap) return; - redrawArea(m.rectPosition, REDRAW_AREA_MONSTER_SPAWNED); + if (!mapViewArea.intersects(m.rectPosition)) return; + redrawNextTick = true; } @Override public void onMonsterRemoved(PredefinedMap map, Monster m, CoordRect previousPosition) { if (map != currentMap) return; + if (!mapViewArea.intersects(m.rectPosition)) return; redrawArea(previousPosition, REDRAW_AREA_MONSTER_KILLED); } @@ -454,37 +455,42 @@ public final class MainView extends SurfaceView @Override public void onMonsterMoved(PredefinedMap map, Monster m, CoordRect previousPosition) { if (map != currentMap) return; - redrawArea(previousPosition, REDRAW_AREA_MONSTER_MOVED); - redrawArea(m.rectPosition, REDRAW_AREA_MONSTER_MOVED); + if (!mapViewArea.intersects(m.rectPosition)) return; + redrawNextTick = true; } @Override public void onSplatterAdded(PredefinedMap map, Coord p) { if (map != currentMap) return; - redrawTile(p, REDRAW_TILE_SPLATTER); + if (!mapViewArea.contains(p)) return; + redrawNextTick = true; } @Override public void onSplatterChanged(PredefinedMap map, Coord p) { if (map != currentMap) return; - redrawTile(p, REDRAW_TILE_SPLATTER); + if (!mapViewArea.contains(p)) return; + redrawNextTick = true; } @Override public void onSplatterRemoved(PredefinedMap map, Coord p) { if (map != currentMap) return; - redrawTile(p, REDRAW_TILE_SPLATTER); + if (!mapViewArea.contains(p)) return; + redrawNextTick = true; } @Override public void onLootBagCreated(PredefinedMap map, Coord p) { if (map != currentMap) return; + if (!mapViewArea.contains(p)) return; redrawTile(p, REDRAW_TILE_BAG); } @Override public void onLootBagRemoved(PredefinedMap map, Coord p) { if (map != currentMap) return; + if (!mapViewArea.contains(p)) return; redrawTile(p, REDRAW_TILE_BAG); } @@ -497,4 +503,19 @@ public final class MainView extends SurfaceView public void onAnimationCompleted(VisualEffectAnimation animation) { redrawArea(animation.area, REDRAW_AREA_EFFECT_COMPLETED); } + + @Override + public void onNewTick() { + if (!redrawNextTick) return; + + redrawAll(REDRAW_ALL_PLAYER_MOVED); + + redrawNextTick = false; + } + + @Override + public void onNewRound() { } + + @Override + public void onNewFullRound() { } }