From a337a02f47a27ad3a1c4f7c8f2a3bd1b67fcc5ed Mon Sep 17 00:00:00 2001 From: "oskar.wiksten" Date: Sat, 5 Nov 2011 13:24:59 +0000 Subject: [PATCH] Refactoring of TileManager that loads image tiles. git-svn-id: https://andors-trail.googlecode.com/svn/trunk@201 08aca716-68be-ccc6-4d58-36f5abd142ac --- .../AndorsTrail/activity/MainActivity.java | 9 ++-- .../AndorsTrail/activity/ShopActivity.java | 2 +- .../controller/MovementController.java | 4 ++ .../AndorsTrail/resource/tiles/TileCache.java | 7 ++- .../resource/tiles/TileManager.java | 31 ++++++++++-- .../AndorsTrail/util/TimedMessageTask.java | 9 ++-- .../rpg/AndorsTrail/view/QuickitemView.java | 48 +++++++++++++++---- 7 files changed, 84 insertions(+), 26 deletions(-) diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MainActivity.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MainActivity.java index 44ad7bb..beff64a 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MainActivity.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MainActivity.java @@ -174,12 +174,11 @@ public final class MainActivity extends Activity { L.log("onResume"); if (!AndorsTrailApplication.getApplicationFromActivity(this).setup.isSceneReady) return; + if (world.model.uiSelections.isInCombat) { + view.combatController.setCombatSelection(world.model.uiSelections.selectedMonster, world.model.uiSelections.selectedPosition); + view.combatController.enterCombat(CombatController.BEGIN_TURN_CONTINUE); + } view.gameRoundController.resume(); - - if (world.model.uiSelections.isInCombat) { - view.combatController.setCombatSelection(world.model.uiSelections.selectedMonster, world.model.uiSelections.selectedPosition); - view.combatController.enterCombat(CombatController.BEGIN_TURN_CONTINUE); - } } @Override diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ShopActivity.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ShopActivity.java index 66faaed..839cd91 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ShopActivity.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ShopActivity.java @@ -75,7 +75,7 @@ public final class ShopActivity extends TabActivity implements OnContainerItemCl HashSet iconIDs = world.tileManager.getTileIDsFor(container_buy); iconIDs.addAll(world.tileManager.getTileIDsFor(player.inventory)); - TileCollection tiles = world.tileManager.tileCache.loadTilesFor(iconIDs, res); + TileCollection tiles = world.tileManager.loadTilesFor(iconIDs, res); buyListAdapter = new ShopItemContainerAdapter(this, tiles, world.tileManager, player, container_buy, this, false); sellListAdapter = new ShopItemContainerAdapter(this, tiles, world.tileManager, player, player.inventory, this, true); shoplist_buy.setAdapter(buyListAdapter); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MovementController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MovementController.java index 1c3ff01..e33a7fa 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MovementController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MovementController.java @@ -265,11 +265,15 @@ public final class MovementController implements TimedMessageTask.Callback { } public static void cacheCurrentMapData(final Resources res, final WorldContext world, final PredefinedMap nextMap) { + L.log("-> cacheCurrentMapData"); + long start = System.currentTimeMillis(); LayeredTileMap mapTiles = TMXMapTranslator.readLayeredTileMap(res, world.tileManager.tileCache, nextMap); TileCollection cachedTiles = world.tileManager.loadTilesFor(nextMap, mapTiles, world, res); world.model.currentTileMap = mapTiles; world.tileManager.currentMapTiles = cachedTiles; world.tileManager.cacheAdjacentMaps(res, world, nextMap); + long duration = System.currentTimeMillis() - start; + L.log(" <- cacheCurrentMapData " + duration + "ms"); } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/tiles/TileCache.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/tiles/TileCache.java index 5948179..7563c2c 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/tiles/TileCache.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/tiles/TileCache.java @@ -61,7 +61,7 @@ public final class TileCache { public TileCollection loadTilesFor(Collection iconIDs, Resources r) { return loadTilesFor(iconIDs, r, null); } public TileCollection loadTilesFor(Collection iconIDs, Resources r, TileCollection result) { - cleanQueue(); + if (AndorsTrailApplication.DEVELOPMENT_DEBUGMESSAGES) L.log("TileCache::loadTilesFor({" + iconIDs.size() + " items})"); int maxTileID = 0; HashMap> tilesToLoadPerSourceFile = new HashMap>(); for(int tileID : iconIDs) { @@ -75,6 +75,7 @@ public final class TileCache { maxTileID = Math.max(maxTileID, tileID); } + boolean hasLoadedTiles = false; if (result == null) result = new TileCollection(maxTileID); for(Entry> e : tilesToLoadPerSourceFile.entrySet()) { TileCutter cutter = null; @@ -91,7 +92,9 @@ public final class TileCache { if (AndorsTrailApplication.DEVELOPMENT_DEBUGMESSAGES) { L.log("Loading tiles from tileset " + e.getKey().tilesetName); } + if (!hasLoadedTiles) cleanQueue(); cutter = new TileCutter(e.getKey(), r); + hasLoadedTiles = true; } bitmap = cutter.createTile(tile.localID); @@ -102,7 +105,7 @@ public final class TileCache { if (cutter != null) cutter.recycle(); } - cleanQueue(); + if (hasLoadedTiles) cleanQueue(); return result; } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/tiles/TileManager.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/tiles/TileManager.java index 1abd823..343c8f5 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/tiles/TileManager.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/tiles/TileManager.java @@ -1,5 +1,6 @@ package com.gpl.rpg.AndorsTrail.resource.tiles; +import java.util.HashMap; import java.util.HashSet; import android.content.res.Resources; @@ -24,6 +25,7 @@ import com.gpl.rpg.AndorsTrail.model.map.MapObject; import com.gpl.rpg.AndorsTrail.model.map.MonsterSpawnArea; import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap; import com.gpl.rpg.AndorsTrail.model.map.TMXMapTranslator; +import com.gpl.rpg.AndorsTrail.util.L; public final class TileManager { public static final int CHAR_HERO = 1; @@ -46,13 +48,17 @@ public final class TileManager { public float scale; - public final TileCache tileCache = new TileCache(); + public final TileCache tileCache = new TileCache(); public final TileCollection preloadedTiles = new TileCollection(72); public TileCollection currentMapTiles; public TileCollection adjacentMapTiles; private final HashSet preloadedTileIDs = new HashSet(); + public TileCollection loadTilesFor(HashSet tileIDs, Resources r) { + return tileCache.loadTilesFor(tileIDs, r); + } + public TileCollection loadTilesFor(ItemContainer container, Resources r) { return tileCache.loadTilesFor(getTileIDsFor(container), r); } @@ -142,10 +148,24 @@ public final class TileManager { tileCache.loadTilesFor(preloadedTileIDs, r, preloadedTiles); } + private HashMap> tileIDsPerMap = new HashMap>(); + private void addTileIDsFor(HashSet dest, String mapName, final Resources res, final WorldContext world) { + HashSet cachedTileIDs = tileIDsPerMap.get(mapName); + if (cachedTileIDs == null) { + PredefinedMap adjacentMap = world.maps.findPredefinedMap(mapName); + if (adjacentMap == null) return; + LayeredTileMap adjacentMapTiles = TMXMapTranslator.readLayeredTileMap(res, tileCache, adjacentMap); + cachedTileIDs = getTileIDsFor(adjacentMap, adjacentMapTiles, world); + tileIDsPerMap.put(mapName, cachedTileIDs); + } + dest.addAll(cachedTileIDs); + } public void cacheAdjacentMaps(final Resources res, final WorldContext world, final PredefinedMap nextMap) { (new AsyncTask() { @Override protected Void doInBackground(Void... arg0) { + L.log("-> cacheAdjacentMaps"); + long start = System.currentTimeMillis(); adjacentMapTiles = null; HashSet adjacentMapNames = new HashSet(); @@ -157,13 +177,14 @@ public final class TileManager { HashSet tileIDs = new HashSet(); for (String mapName : adjacentMapNames) { - PredefinedMap adjacentMap = world.maps.findPredefinedMap(mapName); - if (adjacentMap == null) continue; - LayeredTileMap adjacentMapTiles = TMXMapTranslator.readLayeredTileMap(res, tileCache, adjacentMap); - tileIDs.addAll(getTileIDsFor(adjacentMap, adjacentMapTiles, world)); + addTileIDsFor(tileIDs, mapName, res, world); } + long duration = System.currentTimeMillis() - start; + L.log(" -- cacheAdjacentMaps " + duration + "ms"); adjacentMapTiles = tileCache.loadTilesFor(tileIDs, res); + duration = System.currentTimeMillis() - start; + L.log(" <- cacheAdjacentMaps " + duration + "ms"); return null; } }).execute(); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/util/TimedMessageTask.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/util/TimedMessageTask.java index 425a951..5a2a4d1 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/util/TimedMessageTask.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/util/TimedMessageTask.java @@ -23,12 +23,13 @@ public final class TimedMessageTask extends Handler { if (!isAlive) return; if (!hasQueuedTick) return; hasQueuedTick = false; - if (tick()) queueAnotherTick(); + tick(); } - private boolean tick() { + private void tick() { nextTickTime = System.currentTimeMillis() + interval; - return callback.onTick(this); + boolean continueTicking = callback.onTick(this); + if (continueTicking) queueAnotherTick(); } private void sleep(long delayMillis) { @@ -56,7 +57,7 @@ public final class TimedMessageTask extends Handler { public void start() { isAlive = true; if (shouldCauseTickOnStart()) tick(); - queueAnotherTick(); + else queueAnotherTick(); } public void stop() { diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/QuickitemView.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/QuickitemView.java index 9f21baa..26e6d18 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/QuickitemView.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/QuickitemView.java @@ -1,5 +1,7 @@ package com.gpl.rpg.AndorsTrail.view; +import java.util.HashSet; + import android.R.color; import android.content.Context; import android.content.res.Resources; @@ -15,6 +17,7 @@ import com.gpl.rpg.AndorsTrail.activity.MainActivity; import com.gpl.rpg.AndorsTrail.context.ViewContext; import com.gpl.rpg.AndorsTrail.context.WorldContext; import com.gpl.rpg.AndorsTrail.model.item.ItemType; +import com.gpl.rpg.AndorsTrail.resource.tiles.TileCollection; import com.gpl.rpg.AndorsTrail.resource.tiles.TileManager; public class QuickitemView extends LinearLayout implements OnClickListener { @@ -22,7 +25,9 @@ public class QuickitemView extends LinearLayout implements OnClickListener { private final WorldContext world; private final ViewContext view; - private final QuickButton[] items = new QuickButton[NUM_QUICK_SLOTS]; + private final QuickButton[] buttons = new QuickButton[NUM_QUICK_SLOTS]; + private final HashSet loadedTileIDs = new HashSet(); + private TileCollection tiles = null; public QuickitemView(Context context, AttributeSet attrs) { super(context, attrs); @@ -37,9 +42,9 @@ public class QuickitemView extends LinearLayout implements OnClickListener { this.setBackgroundColor(res.getColor(color.transparent)); TypedArray quickButtons = res.obtainTypedArray(R.array.quick_buttons); - for(int i = 0; i iconIDs = new HashSet(); + + for (ItemType type : world.model.player.inventory.quickitem) { + if (type == null) continue; + iconIDs.add(type.iconID); + } + + loadedTileIDs.clear(); + loadedTileIDs.addAll(iconIDs); + tiles = world.tileManager.loadTilesFor(iconIDs, getResources()); + } + public void registerForContextMenu(MainActivity mainActivity) { - for(QuickButton item: items) + for(QuickButton item: buttons) mainActivity.registerForContextMenu(item); } } -- 2.49.0