TileImages: allow loading a named tiles pack...
and make the overlay map use the 'sm' mapping
This commit is contained in:
parent
2112ee04f0
commit
2791a5658a
2 changed files with 45 additions and 12 deletions
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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())
|
||||||
{
|
{
|
||||||
|
|
Reference in a new issue