tile-names: teach GUI how to load images for dyn-numbered tiles
(this only handles the main view, it does not do anything for the overlay view)
This commit is contained in:
parent
70d5d31aa5
commit
3597e11bbd
3 changed files with 76 additions and 6 deletions
|
@ -12,8 +12,8 @@ import java.util.*;
|
||||||
|
|
||||||
public class TileSpec
|
public class TileSpec
|
||||||
{
|
{
|
||||||
int tileNumber;
|
public final int tileNumber;
|
||||||
String name;
|
public final String name;
|
||||||
TileSpec animNext;
|
TileSpec animNext;
|
||||||
TileSpec onPower;
|
TileSpec onPower;
|
||||||
TileSpec onShutdown;
|
TileSpec onShutdown;
|
||||||
|
|
|
@ -102,6 +102,11 @@ public class Tiles
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int getTileCount()
|
||||||
|
{
|
||||||
|
return tiles.length;
|
||||||
|
}
|
||||||
|
|
||||||
static void checkTiles()
|
static void checkTiles()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < tiles.length; i++) {
|
for (int i = 0; i < tiles.length; i++) {
|
||||||
|
|
|
@ -11,8 +11,10 @@ package micropolisj.gui;
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.awt.image.*;
|
import java.awt.image.*;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.io.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
|
import javax.xml.stream.*;
|
||||||
|
|
||||||
import micropolisj.engine.*;
|
import micropolisj.engine.*;
|
||||||
import static micropolisj.engine.TileConstants.*;
|
import static micropolisj.engine.TileConstants.*;
|
||||||
|
@ -22,6 +24,7 @@ public class TileImages
|
||||||
final int TILE_WIDTH;
|
final int TILE_WIDTH;
|
||||||
final int TILE_HEIGHT;
|
final int TILE_HEIGHT;
|
||||||
Image [] images;
|
Image [] images;
|
||||||
|
int [] tileImageMap;
|
||||||
Map<SpriteKind, Map<Integer, Image> > spriteImages;
|
Map<SpriteKind, Map<Integer, Image> > spriteImages;
|
||||||
|
|
||||||
private TileImages(int size)
|
private TileImages(int size)
|
||||||
|
@ -29,10 +32,69 @@ public class TileImages
|
||||||
this.TILE_WIDTH = size;
|
this.TILE_WIDTH = size;
|
||||||
this.TILE_HEIGHT = size;
|
this.TILE_HEIGHT = size;
|
||||||
|
|
||||||
this.images = loadTileImages("/"+size+"x"+size+"/tiles.png", size);
|
initTileImages(String.format("%dx%d", size, size), size);
|
||||||
loadSpriteImages();
|
loadSpriteImages();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void initTileImages(String baseName, int size)
|
||||||
|
{
|
||||||
|
this.images = loadTileImages("/" + baseName + "/tiles.png", size);
|
||||||
|
initTileImageMap(baseName);
|
||||||
|
}
|
||||||
|
|
||||||
|
void initTileImageMap(String baseName)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
|
||||||
|
// load tile->image mapping
|
||||||
|
this.tileImageMap = new int[Tiles.getTileCount()];
|
||||||
|
String resourceName = "/" + baseName + "/tiles.idx";
|
||||||
|
|
||||||
|
InputStream inStream = TileImages.class.getResourceAsStream(resourceName);
|
||||||
|
XMLStreamReader in = XMLInputFactory.newInstance().createXMLStreamReader(inStream, "UTF-8");
|
||||||
|
|
||||||
|
in.nextTag();
|
||||||
|
if (!(in.getEventType() == XMLStreamConstants.START_ELEMENT &&
|
||||||
|
in.getLocalName().equals("micropolis-tiles-index"))) {
|
||||||
|
throw new IOException("Unrecognized file format");
|
||||||
|
}
|
||||||
|
|
||||||
|
while (in.next() != XMLStreamConstants.END_ELEMENT) {
|
||||||
|
if (!in.isStartElement()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
String tagName = in.getLocalName();
|
||||||
|
if (!tagName.equals("tile")) {
|
||||||
|
in.next();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
String tileName = in.getAttributeValue(null, "name");
|
||||||
|
int imageNumber = Integer.parseInt(in.getAttributeValue(null, "offsetY"));
|
||||||
|
|
||||||
|
assert tileName != null;
|
||||||
|
assert imageNumber >= 0 && imageNumber < images.length;
|
||||||
|
|
||||||
|
TileSpec ts = Tiles.load(tileName);
|
||||||
|
tileImageMap[ts.tileNumber] = imageNumber;
|
||||||
|
|
||||||
|
in.next();
|
||||||
|
}
|
||||||
|
|
||||||
|
in.close();
|
||||||
|
inStream.close();
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (XMLStreamException e) {
|
||||||
|
throw new Error("unexpected: "+e, e);
|
||||||
|
}
|
||||||
|
catch (IOException e) {
|
||||||
|
throw new Error("unexpected: "+e, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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)
|
||||||
|
@ -43,10 +105,13 @@ public class TileImages
|
||||||
return savedInstances.get(size);
|
return savedInstances.get(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Image getTileImage(int cell)
|
public Image getTileImage(int tileNumber)
|
||||||
{
|
{
|
||||||
int tile = (cell & LOMASK) % images.length;
|
assert (tileNumber & LOMASK) == tileNumber;
|
||||||
return images[tile];
|
assert tileNumber >= 0 && tileNumber < tileImageMap.length;
|
||||||
|
|
||||||
|
int imageNumber = tileImageMap[tileNumber];
|
||||||
|
return images[imageNumber];
|
||||||
}
|
}
|
||||||
|
|
||||||
private Image [] loadTileImages(String resourceName, int srcSize)
|
private Image [] loadTileImages(String resourceName, int srcSize)
|
||||||
|
|
Reference in a new issue