From: Oskar Wiksten Date: Sat, 14 Jul 2012 14:05:39 +0000 (+0200) Subject: Automatically save screenshots of maps to sd-card when visiting them. X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=13fc63c07dafc5ca8c687a4f761cff83bc4076e9;p=users%2Fmchehab%2Fandors-trail.git Automatically save screenshots of maps to sd-card when visiting them. --- diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/Constants.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/Constants.java index ea0371e..52ff77b 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/Constants.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/Constants.java @@ -35,6 +35,8 @@ public final class Constants { public static final String PREFERENCE_MODEL_LASTRUNVERSION = "lastversion"; public static final String FILENAME_SAVEGAME_QUICKSAVE = "savegame"; public static final String FILENAME_SAVEGAME_DIRECTORY = "andors-trail"; + public static final String FILENAME_WORLDMAP_DIRECTORY = "worldmap"; + public static final String FILENAME_WORLDMAP_HTMLFILE = "worldmap.html"; public static final String FILENAME_SAVEGAME_FILENAME_PREFIX = "savegame"; diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MovementController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MovementController.java index 32a061c..bd6dee1 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MovementController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MovementController.java @@ -276,6 +276,8 @@ public final class MovementController implements TimedMessageTask.Callback { world.model.currentTileMap = mapTiles; world.tileManager.currentMapTiles = cachedTiles; world.tileManager.cacheAdjacentMaps(res, world, nextMap); + + WorldMapController.updateWorldMap(world, nextMap, mapTiles, cachedTiles); } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/WorldMapController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/WorldMapController.java new file mode 100644 index 0000000..58f6517 --- /dev/null +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/WorldMapController.java @@ -0,0 +1,111 @@ +package com.gpl.rpg.AndorsTrail.controller; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import android.graphics.Bitmap; +import android.graphics.Bitmap.Config; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.os.AsyncTask; +import android.os.Environment; + +import com.gpl.rpg.AndorsTrail.context.WorldContext; +import com.gpl.rpg.AndorsTrail.model.map.LayeredTileMap; +import com.gpl.rpg.AndorsTrail.model.map.MapLayer; +import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap; +import com.gpl.rpg.AndorsTrail.resource.tiles.TileCollection; +import com.gpl.rpg.AndorsTrail.util.L; + +public final class WorldMapController { + public static void updateWorldMap(final WorldContext world, final PredefinedMap map, final LayeredTileMap mapTiles, final TileCollection cachedTiles) { + (new AsyncTask() { + @Override + protected Void doInBackground(Void... arg0) { + + File file = getFileForMap(map); + if (file.exists()) return null; + + try { + Bitmap image = new MapRenderer(world, map, mapTiles, cachedTiles).drawMap(); + ensureWorldmapDirectoryExists(); + FileOutputStream fos = new FileOutputStream(file); + image.compress(Bitmap.CompressFormat.PNG, 70, fos); + fos.flush(); + fos.close(); + image.recycle(); + } catch (IOException e) { + L.log("Error creating worldmap file for map " + map.name + " : " + e.toString()); + } + return null; + } + }).execute(); + } + + private static final class MapRenderer { + private final PredefinedMap map; + private final LayeredTileMap mapTiles; + private final TileCollection cachedTiles; + private final int tileSize; + private static final int outputTileSize = 16; + private final float scale; + private final Paint mPaint = new Paint(); + + public MapRenderer(final WorldContext world, final PredefinedMap map, final LayeredTileMap mapTiles, final TileCollection cachedTiles) { + this.map = map; + this.mapTiles = mapTiles; + this.cachedTiles = cachedTiles; + this.tileSize = world.tileManager.tileSize; + this.scale = (float) outputTileSize / world.tileManager.tileSize; + L.log("outputTileSize=" + outputTileSize + ", tileSize=" + tileSize + ", scale=" + scale); + } + + public Bitmap drawMap() { + Bitmap image = Bitmap.createBitmap(map.size.width * outputTileSize, map.size.height * outputTileSize, Config.RGB_565); + image.setDensity(Bitmap.DENSITY_NONE); + Canvas canvas = new Canvas(image); + canvas.scale(scale, scale); + + drawMapLayer(canvas, mapTiles.layers[LayeredTileMap.LAYER_GROUND]); + tryDrawMapLayer(canvas, LayeredTileMap.LAYER_OBJECTS); + tryDrawMapLayer(canvas, LayeredTileMap.LAYER_ABOVE); + + return image; + } + + private void tryDrawMapLayer(Canvas canvas, final int layerIndex) { + if (mapTiles.layers.length > layerIndex) drawMapLayer(canvas, mapTiles.layers[layerIndex]); + } + + private void drawMapLayer(Canvas canvas, final MapLayer layer) { + int py = 0; + for (int y = 0; y < map.size.height; ++y, py += tileSize) { + int px = 0; + for (int x = 0; x < map.size.width; ++x, px += tileSize) { + final int tile = layer.tiles[x][y]; + if (tile != 0) { + canvas.drawBitmap(cachedTiles.bitmaps[tile], px, py, mPaint); + } + } + } + } + } + + private static void ensureWorldmapDirectoryExists() { + File root = Environment.getExternalStorageDirectory(); + File dir = new File(root, Constants.FILENAME_SAVEGAME_DIRECTORY); + if (!dir.exists()) dir.mkdir(); + dir = new File(dir, Constants.FILENAME_WORLDMAP_DIRECTORY); + if (!dir.exists()) dir.mkdir(); + } + private static File getFileForMap(PredefinedMap map) { + File root = getWorldmapDirectory(); + return new File(root, map.name + ".png"); + } + private static File getWorldmapDirectory() { + File dir = Environment.getExternalStorageDirectory(); + dir = new File(dir, Constants.FILENAME_SAVEGAME_DIRECTORY); + return new File(dir, Constants.FILENAME_WORLDMAP_DIRECTORY); + } +}