]> www.infradead.org Git - users/mchehab/andors-trail.git/commitdiff
Automatically save screenshots of maps to sd-card when visiting them.
authorOskar Wiksten <oskar.wiksten@gmail.com>
Sat, 14 Jul 2012 14:05:39 +0000 (16:05 +0200)
committerOskar Wiksten <oskar.wiksten@gmail.com>
Sun, 7 Oct 2012 14:40:43 +0000 (16:40 +0200)
AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/Constants.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MovementController.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/WorldMapController.java [new file with mode: 0644]

index ea0371ef2b0424e73bbe4b6cd7755fc45255d494..52ff77b62159b8f281744f2fa00bc55d84068fdc 100644 (file)
@@ -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";
        
        
index 32a061c5e4a50cb69cb85768726e56762b1a3426..bd6dee19527183eab485077a1fe32974826513a8 100644 (file)
@@ -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 (file)
index 0000000..58f6517
--- /dev/null
@@ -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<Void, Void, Void>()  {
+                       @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);
+    }
+}