From 71714bb2af12026980294e517c63de3600697f36 Mon Sep 17 00:00:00 2001 From: "oskar.wiksten" Date: Wed, 9 Mar 2011 19:19:51 +0000 Subject: [PATCH] Added preference setting for display size. (normal/x1.5/double). Will be usable for the players using tablets. Reworked scaling of bitmaps to always scale internally to the size preferred by the device, but scale them up according to scale preference when displaying instead. git-svn-id: https://andors-trail.googlecode.com/svn/trunk@55 08aca716-68be-ccc6-4d58-36f5abd142ac --- .../gen/com/gpl/rpg/AndorsTrail/R.java | 10 ++-- AndorsTrail/res/values/strings.xml | 15 +++++- AndorsTrail/res/xml/preferences.xml | 7 +++ .../AndorsTrail/AndorsTrailApplication.java | 4 +- .../AndorsTrail/AndorsTrailPreferences.java | 3 ++ .../src/com/gpl/rpg/AndorsTrail/Dialogs.java | 2 +- .../com/gpl/rpg/AndorsTrail/WorldSetup.java | 13 +++-- .../activity/ConversationActivity.java | 2 +- .../activity/HeroinfoActivity.java | 6 +-- .../activity/ItemInfoActivity.java | 2 +- .../AndorsTrail/activity/LevelUpActivity.java | 2 +- .../AndorsTrail/activity/MainActivity.java | 1 + .../activity/MonsterEncounterActivity.java | 2 +- .../activity/MonsterInfoActivity.java | 2 +- .../activity/StartScreenActivity.java | 6 ++- .../controller/VisualEffectController.java | 11 +++- .../model/actor/MonsterTypeCollection.java | 1 + .../model/item/ItemTypeCollection.java | 2 +- .../resource/DynamicTileLoader.java | 1 + .../AndorsTrail/resource/ResourceLoader.java | 6 +-- .../rpg/AndorsTrail/resource/TileStore.java | 23 +++++++- .../gpl/rpg/AndorsTrail/view/CombatView.java | 2 +- .../view/ItemContainerAdapter.java | 2 +- .../gpl/rpg/AndorsTrail/view/MainView.java | 52 +++++++++++-------- .../view/ShopItemContainerAdapter.java | 2 +- .../gpl/rpg/AndorsTrail/view/StatusView.java | 8 +-- 26 files changed, 129 insertions(+), 58 deletions(-) diff --git a/AndorsTrail/gen/com/gpl/rpg/AndorsTrail/R.java b/AndorsTrail/gen/com/gpl/rpg/AndorsTrail/R.java index b027630ae..2eda2c34d 100644 --- a/AndorsTrail/gen/com/gpl/rpg/AndorsTrail/R.java +++ b/AndorsTrail/gen/com/gpl/rpg/AndorsTrail/R.java @@ -13,6 +13,8 @@ public final class R { public static final int preferences_attackspeed_values=0x7f070004; public static final int preferences_display_loot=0x7f070001; public static final int preferences_display_loot_values=0x7f070002; + public static final int preferences_display_scaling_factor=0x7f070007; + public static final int preferences_display_scaling_factor_values=0x7f070008; public static final int preferences_movementmethod_values=0x7f070006; public static final int preferences_movementmethods=0x7f070005; public static final int questlog_includecompleted=0x7f070000; @@ -297,7 +299,7 @@ public final class R { public static final int about_contents1=0x7f0500f3; public static final int about_contents2=0x7f0500f4; public static final int about_contents3=0x7f0500f5; - /** affliction / statuseffect / temporary effect + /** Translated as: affliction / statuseffect / temporary effect */ public static final int actorcondition_info_removes_all=0x7f05010e; public static final int actorinfo_attack=0x7f0500ae; @@ -353,7 +355,7 @@ public final class R { public static final int conversation_rewardgold=0x7f0500d4; public static final int conversation_rewarditem=0x7f0500d6; public static final int conversation_rewarditems=0x7f0500d7; - public static final int conversation_title=0x7f050122; + public static final int conversation_title=0x7f050124; public static final int conversationlist_alynndir=0x7f050024; public static final int conversationlist_ambelie=0x7f050028; public static final int conversationlist_crossglen=0x7f050003; @@ -506,7 +508,7 @@ public final class R { public static final int itemlist_rings=0x7f050038; public static final int itemlist_v068=0x7f050040; public static final int itemlist_weapons=0x7f050037; - public static final int key_required=0x7f050121; + public static final int key_required=0x7f050123; public static final int levelup_add_attackchance=0x7f0500e7; public static final int levelup_add_attackchance_description=0x7f0500e8; public static final int levelup_add_attackdamage=0x7f0500e9; @@ -554,6 +556,8 @@ public final class R { public static final int preferences_display_category=0x7f0500fd; public static final int preferences_display_fullscreen=0x7f0500ff; public static final int preferences_display_fullscreen_title=0x7f0500fe; + public static final int preferences_display_scaling_factor=0x7f050122; + public static final int preferences_display_scaling_factor_title=0x7f050121; public static final int preferences_movement_category=0x7f05010a; public static final int preferences_movementmethod=0x7f05010c; public static final int preferences_movementmethod_title=0x7f05010b; diff --git a/AndorsTrail/res/values/strings.xml b/AndorsTrail/res/values/strings.xml index 77435cf82..6a7dffdb9 100644 --- a/AndorsTrail/res/values/strings.xml +++ b/AndorsTrail/res/values/strings.xml @@ -302,7 +302,7 @@ - Active conditions + Active conditions Removes all %1$s %1$s chance of %2$s (%1$d rounds) @@ -326,4 +326,17 @@ Move cost penalty +%1$d AP Lowers move cost %1$d AP + Scaling factor + Makes the game view display everything larger. + + Normal size + 1.5x size + Double size + + + 1.0f + 1.5f + 2.0f + + diff --git a/AndorsTrail/res/xml/preferences.xml b/AndorsTrail/res/xml/preferences.xml index 22ed24300..72715fc9b 100644 --- a/AndorsTrail/res/xml/preferences.xml +++ b/AndorsTrail/res/xml/preferences.xml @@ -7,6 +7,13 @@ android:defaultValue="true" android:summary="@string/preferences_display_fullscreen" android:key="fullscreen" /> + diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/AndorsTrailApplication.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/AndorsTrailApplication.java index d89706280..5225ebd09 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/AndorsTrailApplication.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/AndorsTrailApplication.java @@ -14,7 +14,7 @@ import android.view.WindowManager; public final class AndorsTrailApplication extends Application { public static final boolean DEVELOPMENT_DEBUGRESOURCES = false; - public static final boolean DEVELOPMENT_FORCE_STARTNEWGAME = false; + public static final boolean DEVELOPMENT_FORCE_STARTNEWGAME = true; public static final boolean DEVELOPMENT_FORCE_CONTINUEGAME = false; public static final boolean DEVELOPMENT_DEBUGBUTTONS = false; public static final boolean DEVELOPMENT_VALIDATEDATA = true; @@ -23,7 +23,7 @@ public final class AndorsTrailApplication extends Application { public static final String CURRENT_VERSION_DISPLAY = "0.6.9dev"; public final WorldContext world = new WorldContext(); - public WorldSetup setup = new WorldSetup(world, this); + public final WorldSetup setup = new WorldSetup(world, this); public WeakReference currentView; public final AndorsTrailPreferences preferences = new AndorsTrailPreferences(); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/AndorsTrailPreferences.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/AndorsTrailPreferences.java index 95b49d704..fa6639e54 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/AndorsTrailPreferences.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/AndorsTrailPreferences.java @@ -16,6 +16,7 @@ public class AndorsTrailPreferences { public int movementMethod = MOVEMENTMETHOD_STRAIGHT; public static final int MOVEMENTMETHOD_STRAIGHT = 0; public static final int MOVEMENTMETHOD_DIRECTIONAL = 1; + public float scalingFactor = 1.0f; public static void read(final Context androidContext, AndorsTrailPreferences dest) { try { @@ -26,6 +27,7 @@ public class AndorsTrailPreferences { dest.fullscreen = prefs.getBoolean("fullscreen", true); dest.attackspeed_milliseconds = Integer.parseInt(prefs.getString("attackspeed", "1000")); dest.movementMethod = Integer.parseInt(prefs.getString("movementmethod", Integer.toString(MOVEMENTMETHOD_STRAIGHT))); + dest.scalingFactor = Float.parseFloat(prefs.getString("scaling_factor", "1.0f")); } catch (Exception e) { dest.confirmRest = true; dest.confirmAttack = true; @@ -33,6 +35,7 @@ public class AndorsTrailPreferences { dest.fullscreen = true; dest.attackspeed_milliseconds = 1000; dest.movementMethod = MOVEMENTMETHOD_STRAIGHT; + dest.scalingFactor = 1.0f; } } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/Dialogs.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/Dialogs.java index f21dc1883..41880842a 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/Dialogs.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/Dialogs.java @@ -163,7 +163,7 @@ public final class Dialogs { AlertDialog.Builder db = new AlertDialog.Builder(mainActivity) .setTitle(title) .setMessage(msg) - .setIcon(new BitmapDrawable(context.tileStore.bitmaps[TileStore.iconID_groundbag])) + .setIcon(new BitmapDrawable(context.tileStore.getBitmap(TileStore.iconID_groundbag))) .setNegativeButton(R.string.dialog_close, null) .setView(itemList); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/WorldSetup.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/WorldSetup.java index 161284aec..2d7f8f05d 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/WorldSetup.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/WorldSetup.java @@ -31,7 +31,7 @@ public final class WorldSetup { this.androidContext = new WeakReference(androidContext); } - public void startResourceLoader(final Resources r) { + public void startResourceLoader(final Resources r, final AndorsTrailPreferences preferences) { if (isResourcesInitialized) return; synchronized (this) { @@ -42,7 +42,7 @@ public final class WorldSetup { (new AsyncTask() { @Override protected Void doInBackground(Void... arg0) { - ResourceLoader.loadResources(world, r); + ResourceLoader.loadResources(world, r); return null; } @@ -87,9 +87,12 @@ public final class WorldSetup { protected void onPostExecute(Void result) { super.onPostExecute(result); isSceneReady = true; - assert(listener != null); - OnSceneLoadedListener o = listener.get(); - listener = null; + OnSceneLoadedListener o; + synchronized (WorldSetup.this) { + if (listener == null) return; + o = listener.get(); + listener = null; + } if (o == null) return; if (loadResult == Savegames.LOAD_RESULT_SUCCESS) { o.onSceneLoaded(); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ConversationActivity.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ConversationActivity.java index 38f88673e..175eff4b3 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ConversationActivity.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ConversationActivity.java @@ -319,7 +319,7 @@ public final class ConversationActivity extends Activity { final ImageView iv = (ImageView) result.findViewById(R.id.conversation_image); final TextView tv = (TextView) result.findViewById(R.id.conversation_text); if (statement.hasActor()) { - iv.setImageBitmap(tileStore.bitmaps[statement.iconID]); + iv.setImageBitmap(tileStore.getBitmap(statement.iconID)); iv.setVisibility(View.VISIBLE); tv.setText(statement.actorName + ": " + statement.text, BufferType.SPANNABLE); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/HeroinfoActivity.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/HeroinfoActivity.java index 9459161cf..4163e42e6 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/HeroinfoActivity.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/HeroinfoActivity.java @@ -105,7 +105,7 @@ public final class HeroinfoActivity extends TabActivity { container = player.inventory; ImageView iv = (ImageView) findViewById(R.id.heroinfo_image); - iv.setImageBitmap(world.tileStore.bitmaps[player.traits.iconID]); + iv.setImageBitmap(world.tileStore.getBitmap(player.traits.iconID)); ((TextView) findViewById(R.id.heroinfo_title)).setText(player.traits.name); heroinfo_ap = (TextView) findViewById(R.id.heroinfo_ap); @@ -248,7 +248,7 @@ public final class HeroinfoActivity extends TabActivity { private void updateWornImage(ImageView view, int resourceIDEmptyImage, ItemType type) { if (type != null) { - view.setImageBitmap(world.tileStore.bitmaps[type.iconID]); + view.setImageBitmap(world.tileStore.getBitmap(type.iconID)); } else { view.setImageResource(resourceIDEmptyImage); } @@ -270,7 +270,7 @@ public final class HeroinfoActivity extends TabActivity { Resources res = getResources(); for (ActorCondition c : player.conditions) { View v = View.inflate(this, R.layout.inventoryitemview, null); - ((ImageView) v.findViewById(R.id.inv_image)).setImageBitmap(world.tileStore.bitmaps[c.conditionType.iconID]); + ((ImageView) v.findViewById(R.id.inv_image)).setImageBitmap(world.tileStore.getBitmap(c.conditionType.iconID)); ((TextView) v.findViewById(R.id.inv_text)).setText(describeEffect(res, c)); heroinfo_currentconditions.addView(v); } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ItemInfoActivity.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ItemInfoActivity.java index 53cbbff2c..df45158ea 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ItemInfoActivity.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ItemInfoActivity.java @@ -47,7 +47,7 @@ public final class ItemInfoActivity extends Activity { setContentView(R.layout.iteminfo); ImageView img = (ImageView) findViewById(R.id.iteminfo_image); - img.setImageBitmap(world.tileStore.bitmaps[itemType.iconID]); + img.setImageBitmap(world.tileStore.getBitmap(itemType.iconID)); TextView tv = (TextView) findViewById(R.id.iteminfo_title); tv.setText(itemType.name); tv = (TextView) findViewById(R.id.iteminfo_category); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/LevelUpActivity.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/LevelUpActivity.java index bb7ce9e8f..b25450ecb 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/LevelUpActivity.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/LevelUpActivity.java @@ -35,7 +35,7 @@ public final class LevelUpActivity extends Activity { final Resources res = getResources(); ImageView img = (ImageView) findViewById(R.id.levelup_image); - img.setImageBitmap(world.tileStore.bitmaps[player.traits.iconID]); + img.setImageBitmap(world.tileStore.getBitmap(player.traits.iconID)); TextView tv = (TextView) findViewById(R.id.levelup_description); tv.setText(res.getString(R.string.levelup_description, player.level+1)); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MainActivity.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MainActivity.java index 3e1b9e99d..065b0cc82 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MainActivity.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MainActivity.java @@ -162,6 +162,7 @@ public final class MainActivity extends Activity { case INTENTREQUEST_PREFERENCES: AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this); AndorsTrailPreferences.read(this, app.preferences); + world.tileStore.updatePreferences(app.preferences); break; case INTENTREQUEST_SAVEGAME: if (resultCode != Activity.RESULT_OK) break; diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterEncounterActivity.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterEncounterActivity.java index b00c02032..5aa7dcc1a 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterEncounterActivity.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterEncounterActivity.java @@ -42,7 +42,7 @@ public final class MonsterEncounterActivity extends Activity { tv.setText(getString(R.string.dialog_monsterencounter_message, difficulty)); ImageView iw = (ImageView) findViewById(R.id.monsterencounter_image); - iw.setImageBitmap(world.tileStore.bitmaps[monsterType.iconID]); + iw.setImageBitmap(world.tileStore.getBitmap(monsterType.iconID)); Button b = (Button) findViewById(R.id.monsterencounter_attack); b.setOnClickListener(new OnClickListener() { diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterInfoActivity.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterInfoActivity.java index 81ccaaf0b..cf7df1d55 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterInfoActivity.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterInfoActivity.java @@ -38,7 +38,7 @@ public final class MonsterInfoActivity extends Activity { setContentView(R.layout.monsterinfo); ImageView img = (ImageView) findViewById(R.id.monsterinfo_image); - img.setImageBitmap(world.tileStore.bitmaps[monsterType.iconID]); + img.setImageBitmap(world.tileStore.getBitmap(monsterType.iconID)); TextView tv = (TextView) findViewById(R.id.monsterinfo_title); tv.setText(monsterType.name); tv = (TextView) findViewById(R.id.monsterinfo_difficulty); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/StartScreenActivity.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/StartScreenActivity.java index 8c9143567..4b6666426 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/StartScreenActivity.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/StartScreenActivity.java @@ -15,6 +15,7 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; +import android.content.res.Resources; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; @@ -95,7 +96,10 @@ public final class StartScreenActivity extends Activity { } }); - app.setup.startResourceLoader(getResources()); + final Resources res = getResources(); + app.world.tileStore.setDensity(res); + app.world.tileStore.updatePreferences(app.preferences); + app.setup.startResourceLoader(res, app.preferences); if (AndorsTrailApplication.DEVELOPMENT_FORCE_STARTNEWGAME) { continueGame(true, 0, "Debug player"); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/VisualEffectController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/VisualEffectController.java index c41e6b372..3bfc8c9ca 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/VisualEffectController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/VisualEffectController.java @@ -2,6 +2,7 @@ package com.gpl.rpg.AndorsTrail.controller; import android.graphics.Color; import android.graphics.Paint; +import android.graphics.Paint.Align; import com.gpl.rpg.AndorsTrail.VisualEffectCollection; import com.gpl.rpg.AndorsTrail.VisualEffectCollection.VisualEffect; @@ -82,7 +83,10 @@ public final class VisualEffectController { this.effect = effect; this.displayText = (displayValue == 0) ? null : String.valueOf(displayValue); this.textPaint.setColor(effect.textColor); - this.textPaint.setShadowLayer(1, 1, 1, Color.DKGRAY); + this.textPaint.setShadowLayer(2, 1, 1, Color.DKGRAY); + this.textPaint.setTextSize(view.scaledTileSize * 0.5f); // 32dp. + this.textPaint.setAlpha(255); + this.textPaint.setTextAlign(Align.CENTER); this.isAlive = true; this.startTime = System.currentTimeMillis(); this.view = view; @@ -96,6 +100,11 @@ public final class VisualEffectController { final boolean changed = newTileID != this.currentTileID; this.currentTileID = newTileID; this.textYOffset = -2 * (currentFrame); + final int beginFadeAtFrame = effect.lastFrame / 2; + if (currentFrame >= beginFadeAtFrame) { + this.textPaint.setAlpha(255 * (effect.lastFrame - currentFrame) / (effect.lastFrame - beginFadeAtFrame)); + } + if (changed) { view.redrawAreaWithEffect(area, this); } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/MonsterTypeCollection.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/MonsterTypeCollection.java index 3e40bc9b7..576a0bdde 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/MonsterTypeCollection.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/MonsterTypeCollection.java @@ -87,6 +87,7 @@ public final class MonsterTypeCollection { public void DEBUG_initializeTestEffectMonsters(WorldContext world) { MonsterType t = getMonsterTypeFromName("Forest Snake"); + if (t == null) return; t.onHitEffects = new ItemTraits_OnUse[] { new ItemTraits_OnUse(null, null, null, new ActorConditionEffect[] { new ActorConditionEffect(world.actorConditionsTypes.getActorConditionType("poison"), 1, 3, new ConstRange(1, 1)) diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemTypeCollection.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemTypeCollection.java index 3f195a3bb..e3c180868 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemTypeCollection.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemTypeCollection.java @@ -126,7 +126,7 @@ public final class ItemTypeCollection { */ ItemType ring_dmg1 = getItemTypeByTag("ring_dmg1"); - + if (ring_dmg1 == null) return; ItemType itemType = new ItemType( nextId , ring_dmg1.iconID diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/DynamicTileLoader.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/DynamicTileLoader.java index f89eb5343..405f571dc 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/DynamicTileLoader.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/DynamicTileLoader.java @@ -143,6 +143,7 @@ public final class DynamicTileLoader { } private Bitmap createTilesetImage(TilesetBitmap b) { + //return BitmapFactory.decodeResource(r, b.resourceId); Options o = new Options(); o.inScaled = false; Bitmap sourceImage = BitmapFactory.decodeResource(r, b.resourceId, o); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/ResourceLoader.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/ResourceLoader.java index 8212dbb2c..ed8d4e8a6 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/ResourceLoader.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/ResourceLoader.java @@ -10,7 +10,6 @@ import com.gpl.rpg.AndorsTrail.model.item.ItemTypeCollection; import com.gpl.rpg.AndorsTrail.model.map.TMXMapReader; import com.gpl.rpg.AndorsTrail.model.quest.QuestLoader; import com.gpl.rpg.AndorsTrail.util.ConstRange; -import com.gpl.rpg.AndorsTrail.util.L; import com.gpl.rpg.AndorsTrail.util.Size; import android.content.res.Resources; @@ -20,10 +19,7 @@ public final class ResourceLoader { public static void loadResources(WorldContext world, Resources r) { final TileStore tiles = world.tileStore; - tiles.displayTileSize = DynamicTileLoader.measureBitmapWidth(r, R.drawable.equip_body); // Should be 32 on regular size. - L.log("displayTileSize=" + tiles.displayTileSize); - final int mTileSize = tiles.displayTileSize; - L.log("mTileSize=" + mTileSize); + final int mTileSize = tiles.tileSize; final Size dst_sz1x1 = new Size(mTileSize, mTileSize); final Size dst_sz2x2 = new Size(mTileSize*2, mTileSize*2); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/TileStore.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/TileStore.java index 048592e08..7d50688c7 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/TileStore.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/TileStore.java @@ -1,5 +1,8 @@ package com.gpl.rpg.AndorsTrail.resource; +import com.gpl.rpg.AndorsTrail.AndorsTrailPreferences; + +import android.content.res.Resources; import android.graphics.Bitmap; public final class TileStore { @@ -8,8 +11,22 @@ public final class TileStore { public static final int iconID_moveselect = 3; public static final int iconID_groundbag = 4; public static final int iconID_shop = iconID_groundbag; + + private float density; + public int tileSize; + + public int viewTileSize; + public float scale; + + public void setDensity(Resources r) { + density = r.getDisplayMetrics().density; + tileSize = (int) (32 * density); + } - public int displayTileSize = 32; + public void updatePreferences(AndorsTrailPreferences prefs) { + scale = prefs.scalingFactor; + viewTileSize = (int) (tileSize * prefs.scalingFactor); + } //TODO: should be final. public Bitmap[] bitmaps = new Bitmap[1]; @@ -21,4 +38,8 @@ public final class TileStore { bitmaps = new Bitmap[bitmaps.length + tilecount]; System.arraycopy(oldArray, 0, bitmaps, 0, oldArray.length); } + + public Bitmap getBitmap(int tileID) { + return bitmaps[tileID]; + } } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/CombatView.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/CombatView.java index 25fdc84dc..1e01eacdf 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/CombatView.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/CombatView.java @@ -107,7 +107,7 @@ public final class CombatView extends FrameLayout { if (selectedMonster != null) { attackMoveButton.setText(getResources().getString(R.string.combat_attack, world.model.player.traits.attackCost)); monsterBar.setVisibility(View.VISIBLE); - monsterInfo.setImageBitmap(world.tileStore.bitmaps[selectedMonster.traits.iconID]); + monsterInfo.setImageBitmap(world.tileStore.getBitmap(selectedMonster.traits.iconID)); updateMonsterHealth(selectedMonster.health); currentMonsterType = selectedMonster.monsterType; } else if (selectedMovePosition != null) { diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/ItemContainerAdapter.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/ItemContainerAdapter.java index 3ca773344..43f13d08b 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/ItemContainerAdapter.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/ItemContainerAdapter.java @@ -30,7 +30,7 @@ public final class ItemContainerAdapter extends ArrayAdapter { result = View.inflate(getContext(), R.layout.inventoryitemview, null); } - ((ImageView) result.findViewById(R.id.inv_image)).setImageBitmap(tileStore.bitmaps[item.itemType.iconID]); + ((ImageView) result.findViewById(R.id.inv_image)).setImageBitmap(tileStore.getBitmap(item.itemType.iconID)); ((TextView) result.findViewById(R.id.inv_text)).setText(item.itemType.describeWearEffect(item.quantity)); return result; } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/MainView.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/MainView.java index 445556feb..d624ac731 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/MainView.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/MainView.java @@ -30,7 +30,9 @@ import android.view.View; public final class MainView extends SurfaceView implements SurfaceHolder.Callback { - private int displayTileSize = 32; + private final int tileSize; + private float scale; + public int scaledTileSize; private Size screenSizeTileCount = null; private final Coord screenOffset = new Coord(); // pixel offset where the image begins @@ -55,11 +57,12 @@ public final class MainView extends SurfaceView implements SurfaceHolder.Callbac super(context, attr); this.holder = getHolder(); - AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivityContext(context); + AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivityContext(context); this.view = app.currentView.get(); this.model = app.world.model; this.tiles = app.world.tileStore; - + this.tileSize = tiles.tileSize; + holder.addCallback(this); setFocusable(true); @@ -113,16 +116,19 @@ public final class MainView extends SurfaceView implements SurfaceHolder.Callbac L.log("surfaceChanged " + w + ", " + h); - displayTileSize = tiles.displayTileSize; + this.scale = tiles.scale; + this.scaledTileSize = tiles.viewTileSize; + L.log("scale=" + scale); + L.log("scaledTileSize=" + scaledTileSize); screenSizeTileCount = new Size( - (int) Math.floor(w / displayTileSize) - ,(int) Math.floor(h / displayTileSize) + (int) Math.floor(w / scaledTileSize) + ,(int) Math.floor(h / scaledTileSize) ); screenOffset.set( - (w - (displayTileSize * screenSizeTileCount.width)) / 2 - ,(h - (displayTileSize * screenSizeTileCount.height)) / 2 + (w - (scaledTileSize * screenSizeTileCount.width)) / 2 + ,(h - (scaledTileSize * screenSizeTileCount.height)) / 2 ); if (model.currentMap != null) { @@ -181,8 +187,8 @@ public final class MainView extends SurfaceView implements SurfaceHolder.Callbac if (!allowInputInterval()) return true; lastTouchPosition_tileCoords.set( - (int) Math.floor(((int)event.getX() - screenOffset.x) / displayTileSize) + mapTopLeft.x - ,(int) Math.floor(((int)event.getY() - screenOffset.y) / displayTileSize) + mapTopLeft.y); + (int) Math.floor(((int)event.getX() - screenOffset.x) / scaledTileSize) + mapTopLeft.x + ,(int) Math.floor(((int)event.getY() - screenOffset.y) / scaledTileSize) + mapTopLeft.y); lastTouchPosition_dx = lastTouchPosition_tileCoords.x - model.player.position.x; lastTouchPosition_dy = lastTouchPosition_tileCoords.y - model.player.position.y; @@ -229,6 +235,7 @@ public final class MainView extends SurfaceView implements SurfaceHolder.Callbac c = holder.lockCanvas(redrawRect); synchronized (holder) { c.translate(screenOffset.x, screenOffset.y); + c.scale(scale, scale); doDrawRect(c, area); } } finally { @@ -253,6 +260,7 @@ public final class MainView extends SurfaceView implements SurfaceHolder.Callbac c = holder.lockCanvas(redrawRect); synchronized (holder) { c.translate(screenOffset.x, screenOffset.y); + c.scale(scale, scale); doDrawRect(c, area); drawFromMapPosition(c, area, effect.position, effect.currentTileID); if (effect.displayText != null) { @@ -291,10 +299,10 @@ public final class MainView extends SurfaceView implements SurfaceHolder.Callbac } private void worldCoordsToScreenCords(final CoordRect worldArea, Rect destScreenRect) { - destScreenRect.left = screenOffset.x + (worldArea.topLeft.x - mapViewArea.topLeft.x) * displayTileSize; - destScreenRect.top = screenOffset.y + (worldArea.topLeft.y - mapViewArea.topLeft.y) * displayTileSize; - destScreenRect.right = destScreenRect.left + worldArea.size.width * displayTileSize; - destScreenRect.bottom = destScreenRect.top + worldArea.size.height * displayTileSize; + destScreenRect.left = screenOffset.x + (worldArea.topLeft.x - mapViewArea.topLeft.x) * scaledTileSize; + destScreenRect.top = screenOffset.y + (worldArea.topLeft.y - mapViewArea.topLeft.y) * scaledTileSize; + destScreenRect.right = destScreenRect.left + worldArea.size.width * scaledTileSize; + destScreenRect.bottom = destScreenRect.top + worldArea.size.height * scaledTileSize; } private void doDrawRect(Canvas canvas, CoordRect area) { @@ -333,12 +341,12 @@ public final class MainView extends SurfaceView implements SurfaceHolder.Callbac private void drawMapLayer(Canvas canvas, final CoordRect area, final MapLayer layer) { int my = area.topLeft.y; - int py = (area.topLeft.y - mapViewArea.topLeft.y) * displayTileSize; - int px0 = (area.topLeft.x - mapViewArea.topLeft.x) * displayTileSize; - for (int y = 0; y < area.size.height; ++y, ++my, py += displayTileSize) { + int py = (area.topLeft.y - mapViewArea.topLeft.y) * tileSize; + int px0 = (area.topLeft.x - mapViewArea.topLeft.x) * tileSize; + for (int y = 0; y < area.size.height; ++y, ++my, py += tileSize) { int mx = area.topLeft.x; int px = px0; - for (int x = 0; x < area.size.width; ++x, ++mx, px += displayTileSize) { + for (int x = 0; x < area.size.width; ++x, ++mx, px += tileSize) { final int tile = layer.tiles[mx][my]; if (tile != 0) { canvas.drawBitmap(tiles.bitmaps[tile], px, py, mPaint); @@ -361,15 +369,15 @@ public final class MainView extends SurfaceView implements SurfaceHolder.Callbac if ( (x >= 0 && x < mapViewArea.size.width) && (y >= 0 && y < mapViewArea.size.height)) { canvas.drawBitmap(tiles.bitmaps[tile], - x * displayTileSize, - y * displayTileSize, + x * tileSize, + y * tileSize, mPaint); } } private void drawEffectText(Canvas canvas, final CoordRect area, final VisualEffectAnimation e) { - int x = (e.position.x - mapViewArea.topLeft.x) * displayTileSize + displayTileSize/2; - int y = (e.position.y - mapViewArea.topLeft.y) * displayTileSize + displayTileSize/2 + e.textYOffset; + int x = (e.position.x - mapViewArea.topLeft.x) * tileSize + tileSize/2; + int y = (e.position.y - mapViewArea.topLeft.y) * tileSize + tileSize/2 + e.textYOffset; canvas.drawText(e.displayText, x, y, e.textPaint); } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/ShopItemContainerAdapter.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/ShopItemContainerAdapter.java index 7f13988bb..df0d4c7c4 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/ShopItemContainerAdapter.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/ShopItemContainerAdapter.java @@ -45,7 +45,7 @@ public final class ShopItemContainerAdapter extends ArrayAdapter { result = View.inflate(getContext(), R.layout.shopitemview, null); } - ((ImageView) result.findViewById(R.id.shopitem_image)).setImageBitmap(tileStore.bitmaps[itemType.iconID]); + ((ImageView) result.findViewById(R.id.shopitem_image)).setImageBitmap(tileStore.getBitmap(itemType.iconID)); ((TextView) result.findViewById(R.id.shopitem_text)).setText(itemType.describeWearEffect(item.quantity)); Button b = (Button) result.findViewById(R.id.shopitem_shopbutton); if (isSelling) { diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/StatusView.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/StatusView.java index d812450af..6b88b306e 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/StatusView.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/StatusView.java @@ -60,8 +60,8 @@ public final class StatusView extends RelativeLayout { expBar.init(R.drawable.ui_progress_exp, R.string.status_exp); levelupDrawable = new LayerDrawable(new Drawable[] { - new BitmapDrawable(world.tileStore.bitmaps[player.traits.iconID]) - ,new BitmapDrawable(world.tileStore.bitmaps[TileStore.iconID_moveselect]) + new BitmapDrawable(world.tileStore.getBitmap(player.traits.iconID)) + ,new BitmapDrawable(world.tileStore.getBitmap(TileStore.iconID_moveselect)) }); updateStatus(); @@ -82,14 +82,14 @@ public final class StatusView extends RelativeLayout { if (canLevelUp) { heroImage.setImageDrawable(levelupDrawable); } else { - heroImage.setImageBitmap(world.tileStore.bitmaps[player.traits.iconID]); + heroImage.setImageBitmap(world.tileStore.getBitmap(player.traits.iconID)); } } public void updateActiveConditions(Context androidContext, LinearLayout activeConditions) { GreedyImageViewAppender t = new GreedyImageViewAppender(androidContext, activeConditions); for (ActorCondition condition : player.conditions) { - t.setCurrentImage(world.tileStore.bitmaps[condition.conditionType.iconID]); + t.setCurrentImage(world.tileStore.getBitmap(condition.conditionType.iconID)); } t.removeOtherImages(); }