TileImages: allow loading a named tiles pack...

and make the overlay map use the 'sm' mapping
This commit is contained in:
Jason Long 2014-06-18 14:46:20 -04:00
parent 2112ee04f0
commit 2791a5658a
2 changed files with 45 additions and 12 deletions

View file

@ -94,10 +94,11 @@ public class OverlayMapView extends JComponent
repaint(); repaint();
} }
static BufferedImage tileArrayImage = loadImage("/sm/tiles.png");
static final int TILE_WIDTH = 3; static final int TILE_WIDTH = 3;
static final int TILE_HEIGHT = 3; static final int TILE_HEIGHT = 3;
static final int TILE_OFFSET_Y = 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) static BufferedImage loadImage(String resourceName)
{ {
@ -411,12 +412,13 @@ public class OverlayMapView extends JComponent
{ {
assert tile >= 0; assert tile >= 0;
int imageNumber = tileArray.tileImageMap[tile];
for (int yy = 0; yy < TILE_HEIGHT; yy++) for (int yy = 0; yy < TILE_HEIGHT; yy++)
{ {
for (int xx = 0; xx < TILE_WIDTH; xx++) for (int xx = 0; xx < TILE_WIDTH; xx++)
{ {
img.setRGB(x*TILE_WIDTH+xx,y*TILE_HEIGHT+yy, 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));
} }
} }
} }

View file

@ -22,35 +22,50 @@ import static micropolisj.XML_Helper.*;
public class TileImages public class TileImages
{ {
final String name;
final int TILE_WIDTH; final int TILE_WIDTH;
final int TILE_HEIGHT; final int TILE_HEIGHT;
Image [] images; Image [] images;
int [] tileImageMap; int [] tileImageMap;
Map<SpriteKind, Map<Integer, Image> > spriteImages; Map<SpriteKind, Map<Integer, Image> > spriteImages;
private TileImages(int size) private TileImages(String name, int size)
{ {
this.name = name;
this.TILE_WIDTH = size; this.TILE_WIDTH = size;
this.TILE_HEIGHT = size; this.TILE_HEIGHT = size;
initTileImages(String.format("%dx%d", size, size), size); initTileImageMap();
loadSpriteImages();
} }
void initTileImages(String baseName, int size) String getResourceName()
{ {
this.images = loadTileImages("/" + baseName + "/tiles.png", size); return "/" + name + "/tiles.png";
initTileImageMap(baseName);
} }
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 try
{ {
// load tile->image mapping // load tile->image mapping
this.tileImageMap = new int[Tiles.getTileCount()]; this.tileImageMap = new int[Tiles.getTileCount()];
String resourceName = "/" + baseName + "/tiles.idx"; String resourceName = "/" + name + "/tiles.idx";
InputStream inStream = TileImages.class.getResourceAsStream(resourceName); InputStream inStream = TileImages.class.getResourceAsStream(resourceName);
XMLStreamReader in = XMLInputFactory.newInstance().createXMLStreamReader(inStream, "UTF-8"); XMLStreamReader in = XMLInputFactory.newInstance().createXMLStreamReader(inStream, "UTF-8");
@ -83,7 +98,7 @@ public class TileImages
} }
assert tileName != null; assert tileName != null;
assert imageNumber >= 0 && imageNumber < images.length; assert imageNumber >= 0;
TileSpec ts = Tiles.load(tileName); TileSpec ts = Tiles.load(tileName);
tileImageMap[ts.tileNumber] = imageNumber; tileImageMap[ts.tileNumber] = imageNumber;
@ -106,15 +121,24 @@ public class TileImages
static Map<Integer,TileImages> savedInstances = new HashMap<Integer,TileImages>(); static Map<Integer,TileImages> savedInstances = new HashMap<Integer,TileImages>();
public static TileImages getInstance(int size) 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)) { if (!savedInstances.containsKey(size)) {
savedInstances.put(size, new TileImages(size)); savedInstances.put(size, new TileImages(name, size));
} }
return savedInstances.get(size); return savedInstances.get(size);
} }
public Image getTileImage(int tileNumber) public Image getTileImage(int tileNumber)
{ {
assert images != null;
assert (tileNumber & LOMASK) == tileNumber; assert (tileNumber & LOMASK) == tileNumber;
assert tileNumber >= 0 && tileNumber < tileImageMap.length; assert tileNumber >= 0 && tileNumber < tileImageMap.length;
@ -148,11 +172,18 @@ public class TileImages
public Image getSpriteImage(SpriteKind kind, int frameNumber) public Image getSpriteImage(SpriteKind kind, int frameNumber)
{ {
assert spriteImages != null;
return spriteImages.get(kind).get(frameNumber); return spriteImages.get(kind).get(frameNumber);
} }
private void loadSpriteImages() private void loadSpriteImages()
{ {
if (this.spriteImages != null) {
// already loaded
return;
}
spriteImages = new EnumMap<SpriteKind, Map<Integer,Image> >(SpriteKind.class); spriteImages = new EnumMap<SpriteKind, Map<Integer,Image> >(SpriteKind.class);
for (SpriteKind kind : SpriteKind.values()) for (SpriteKind kind : SpriteKind.values())
{ {