TileImages: put placeholder for animated tile support
This commit is contained in:
parent
8acf22d790
commit
0d6f6d4789
2 changed files with 71 additions and 11 deletions
|
@ -412,7 +412,7 @@ public class OverlayMapView extends JComponent
|
||||||
{
|
{
|
||||||
assert tile >= 0;
|
assert tile >= 0;
|
||||||
|
|
||||||
int imageNumber = tileArray.tileImageMap[tile];
|
int imageNumber = tileArray.getTileImageNumber(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++)
|
||||||
|
|
|
@ -26,9 +26,23 @@ 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;
|
TileImage [] tileImageMap;
|
||||||
Map<SpriteKind, Map<Integer, Image> > spriteImages;
|
Map<SpriteKind, Map<Integer, Image> > spriteImages;
|
||||||
|
|
||||||
|
static abstract class TileImage
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static class SimpleTileImage extends TileImage
|
||||||
|
{
|
||||||
|
int imageNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
static class AnimatedTile extends TileImage
|
||||||
|
{
|
||||||
|
SimpleTileImage [] frames;
|
||||||
|
}
|
||||||
|
|
||||||
private TileImages(String name, int size)
|
private TileImages(String name, int size)
|
||||||
{
|
{
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
@ -53,6 +67,33 @@ public class TileImages
|
||||||
this.images = loadTileImages(getResourceName(), TILE_HEIGHT);
|
this.images = loadTileImages(getResourceName(), TILE_HEIGHT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SimpleTileImage readSimpleImage(XMLStreamReader in)
|
||||||
|
throws XMLStreamException
|
||||||
|
{
|
||||||
|
SimpleTileImage img = new SimpleTileImage();
|
||||||
|
String tmp = in.getAttributeValue(null, "offsetY");
|
||||||
|
img.imageNumber = tmp != null ? Integer.parseInt(tmp) : 0;
|
||||||
|
return img;
|
||||||
|
}
|
||||||
|
|
||||||
|
AnimatedTile readAnimation(XMLStreamReader in)
|
||||||
|
throws XMLStreamException
|
||||||
|
{
|
||||||
|
ArrayList<SimpleTileImage> frames = new ArrayList<SimpleTileImage>();
|
||||||
|
|
||||||
|
while (in.nextTag() != XMLStreamConstants.END_ELEMENT) {
|
||||||
|
String tagName = in.getLocalName();
|
||||||
|
if (tagName.equals("frame")) {
|
||||||
|
frames.add(readSimpleImage(in));
|
||||||
|
}
|
||||||
|
skipToEndElement(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
AnimatedTile anim = new AnimatedTile();
|
||||||
|
anim.frames = frames.toArray(new SimpleTileImage[0]);
|
||||||
|
return anim;
|
||||||
|
}
|
||||||
|
|
||||||
void initTileImageMap()
|
void initTileImageMap()
|
||||||
{
|
{
|
||||||
if (this.spriteImages != null) {
|
if (this.spriteImages != null) {
|
||||||
|
@ -64,7 +105,7 @@ public class TileImages
|
||||||
{
|
{
|
||||||
|
|
||||||
// load tile->image mapping
|
// load tile->image mapping
|
||||||
this.tileImageMap = new int[Tiles.getTileCount()];
|
this.tileImageMap = new TileImage[Tiles.getTileCount()];
|
||||||
String resourceName = "/" + name + "/tiles.idx";
|
String resourceName = "/" + name + "/tiles.idx";
|
||||||
|
|
||||||
InputStream inStream = TileImages.class.getResourceAsStream(resourceName);
|
InputStream inStream = TileImages.class.getResourceAsStream(resourceName);
|
||||||
|
@ -86,22 +127,24 @@ public class TileImages
|
||||||
}
|
}
|
||||||
|
|
||||||
String tileName = in.getAttributeValue(null, "name");
|
String tileName = in.getAttributeValue(null, "name");
|
||||||
int imageNumber = -1;
|
TileImage img = null;
|
||||||
|
|
||||||
while (in.nextTag() != XMLStreamConstants.END_ELEMENT) {
|
while (in.nextTag() != XMLStreamConstants.END_ELEMENT) {
|
||||||
assert in.isStartElement();
|
assert in.isStartElement();
|
||||||
if (in.getLocalName().equals("image")) {
|
if (in.getLocalName().equals("image")) {
|
||||||
String tmp = in.getAttributeValue(null, "offsetY");
|
img = readSimpleImage(in);
|
||||||
imageNumber = tmp != null ? Integer.parseInt(tmp) : 0;
|
}
|
||||||
|
else if (in.getLocalName().equals("animation")) {
|
||||||
|
img = readAnimation(in);
|
||||||
}
|
}
|
||||||
skipToEndElement(in);
|
skipToEndElement(in);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert tileName != null;
|
assert tileName != null;
|
||||||
assert imageNumber >= 0;
|
assert img != null;
|
||||||
|
|
||||||
TileSpec ts = Tiles.load(tileName);
|
TileSpec ts = Tiles.load(tileName);
|
||||||
tileImageMap[ts.tileNumber] = imageNumber;
|
tileImageMap[ts.tileNumber] = img;
|
||||||
|
|
||||||
assert in.isEndElement() && in.getLocalName().equals("tile");
|
assert in.isEndElement() && in.getLocalName().equals("tile");
|
||||||
}
|
}
|
||||||
|
@ -136,13 +179,30 @@ public class TileImages
|
||||||
return savedInstances.get(size);
|
return savedInstances.get(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Image getTileImage(int tileNumber)
|
public int getTileImageNumber(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;
|
||||||
|
|
||||||
int imageNumber = tileImageMap[tileNumber];
|
TileImage ti = tileImageMap[tileNumber];
|
||||||
|
if (ti instanceof SimpleTileImage) {
|
||||||
|
return ((SimpleTileImage) ti).imageNumber;
|
||||||
|
}
|
||||||
|
else if (ti instanceof AnimatedTile) {
|
||||||
|
AnimatedTile anim = (AnimatedTile) ti;
|
||||||
|
return anim.frames[0].imageNumber;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
assert false;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Image getTileImage(int tileNumber)
|
||||||
|
{
|
||||||
|
assert images != null;
|
||||||
|
|
||||||
|
int imageNumber = getTileImageNumber(tileNumber);
|
||||||
return images[imageNumber];
|
return images[imageNumber];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Reference in a new issue