From 2791a5658a001c97f27d1753fa0b202233c4da55 Mon Sep 17 00:00:00 2001 From: Jason Long Date: Wed, 18 Jun 2014 14:46:20 -0400 Subject: [PATCH] TileImages: allow loading a named tiles pack... and make the overlay map use the 'sm' mapping --- src/micropolisj/gui/OverlayMapView.java | 6 ++- src/micropolisj/gui/TileImages.java | 51 ++++++++++++++++++++----- 2 files changed, 45 insertions(+), 12 deletions(-) diff --git a/src/micropolisj/gui/OverlayMapView.java b/src/micropolisj/gui/OverlayMapView.java index 8de4c72..33d6110 100644 --- a/src/micropolisj/gui/OverlayMapView.java +++ b/src/micropolisj/gui/OverlayMapView.java @@ -94,10 +94,11 @@ public class OverlayMapView extends JComponent repaint(); } - static BufferedImage tileArrayImage = loadImage("/sm/tiles.png"); static final int TILE_WIDTH = 3; static final int TILE_HEIGHT = 3; static final int TILE_OFFSET_Y = 3; + static TileImages tileArray = TileImages.getInstance("sm", TILE_HEIGHT); + static BufferedImage tileArrayImage = loadImage(tileArray.getResourceName()); static BufferedImage loadImage(String resourceName) { @@ -411,12 +412,13 @@ public class OverlayMapView extends JComponent { assert tile >= 0; + int imageNumber = tileArray.tileImageMap[tile]; for (int yy = 0; yy < TILE_HEIGHT; yy++) { for (int xx = 0; xx < TILE_WIDTH; xx++) { img.setRGB(x*TILE_WIDTH+xx,y*TILE_HEIGHT+yy, - tileArrayImage.getRGB(xx,tile*TILE_OFFSET_Y+yy)); + tileArrayImage.getRGB(xx,imageNumber*TILE_OFFSET_Y+yy)); } } } diff --git a/src/micropolisj/gui/TileImages.java b/src/micropolisj/gui/TileImages.java index 05a5140..167c0a9 100644 --- a/src/micropolisj/gui/TileImages.java +++ b/src/micropolisj/gui/TileImages.java @@ -22,35 +22,50 @@ import static micropolisj.XML_Helper.*; public class TileImages { + final String name; final int TILE_WIDTH; final int TILE_HEIGHT; Image [] images; int [] tileImageMap; Map > spriteImages; - private TileImages(int size) + private TileImages(String name, int size) { + this.name = name; this.TILE_WIDTH = size; this.TILE_HEIGHT = size; - initTileImages(String.format("%dx%d", size, size), size); - loadSpriteImages(); + initTileImageMap(); } - void initTileImages(String baseName, int size) + String getResourceName() { - this.images = loadTileImages("/" + baseName + "/tiles.png", size); - initTileImageMap(baseName); + return "/" + name + "/tiles.png"; } - void initTileImageMap(String baseName) + void initTileImages() { + if (this.images != null) { + // already loaded + return; + } + + this.images = loadTileImages(getResourceName(), TILE_HEIGHT); + } + + void initTileImageMap() + { + if (this.spriteImages != null) { + // already loaded + return; + } + try { // load tile->image mapping this.tileImageMap = new int[Tiles.getTileCount()]; - String resourceName = "/" + baseName + "/tiles.idx"; + String resourceName = "/" + name + "/tiles.idx"; InputStream inStream = TileImages.class.getResourceAsStream(resourceName); XMLStreamReader in = XMLInputFactory.newInstance().createXMLStreamReader(inStream, "UTF-8"); @@ -83,7 +98,7 @@ public class TileImages } assert tileName != null; - assert imageNumber >= 0 && imageNumber < images.length; + assert imageNumber >= 0; TileSpec ts = Tiles.load(tileName); tileImageMap[ts.tileNumber] = imageNumber; @@ -106,15 +121,24 @@ public class TileImages static Map savedInstances = new HashMap(); public static TileImages getInstance(int size) + { + TileImages self = getInstance(String.format("%dx%d", size, size), size); + self.initTileImages(); + self.loadSpriteImages(); + return self; + } + + public static TileImages getInstance(String name, int size) { if (!savedInstances.containsKey(size)) { - savedInstances.put(size, new TileImages(size)); + savedInstances.put(size, new TileImages(name, size)); } return savedInstances.get(size); } public Image getTileImage(int tileNumber) { + assert images != null; assert (tileNumber & LOMASK) == tileNumber; assert tileNumber >= 0 && tileNumber < tileImageMap.length; @@ -148,11 +172,18 @@ public class TileImages public Image getSpriteImage(SpriteKind kind, int frameNumber) { + assert spriteImages != null; + return spriteImages.get(kind).get(frameNumber); } private void loadSpriteImages() { + if (this.spriteImages != null) { + // already loaded + return; + } + spriteImages = new EnumMap >(SpriteKind.class); for (SpriteKind kind : SpriteKind.values()) {