diff --git a/src/micropolisj/build_tool/Animation.java b/src/micropolisj/build_tool/Animation.java new file mode 100644 index 0000000..68d8468 --- /dev/null +++ b/src/micropolisj/build_tool/Animation.java @@ -0,0 +1,84 @@ +package micropolisj.build_tool; + +import java.awt.Graphics2D; +import java.io.*; +import java.util.*; +import javax.xml.stream.*; +import static micropolisj.XML_Helper.*; + +class Animation extends MakeTiles.TileImage +{ + static final int DEFAULT_DURATION = 125; + List frames = new ArrayList(); + + public static Animation load(File aniFile) + throws IOException + { + FileInputStream fis = new FileInputStream(aniFile); + Animation self = new Animation(); + self.load(fis); + return self; + } + + void load(InputStream inStream) + throws IOException + { + try { + + XMLStreamReader in = XMLInputFactory.newInstance().createXMLStreamReader(inStream, "UTF-8"); + in.nextTag(); + if (!(in.getEventType() == XMLStreamConstants.START_ELEMENT && + in.getLocalName().equals("micropolis-animation"))) { + throw new IOException("Unrecognized file format"); + } + + while (in.nextTag() != XMLStreamConstants.END_ELEMENT) { + assert in.isStartElement(); + + String tagName = in.getLocalName(); + if (tagName.equals("frame")) { + + String tmp = in.getAttributeValue(null, "duration"); + int duration = tmp != null ? Integer.parseInt(tmp) : DEFAULT_DURATION; + + tmp = in.getElementText(); + frames.add( + new AnimationFrame( + MakeTiles.parseFrameSpec(tmp), + duration + )); + } + else { + // unrecognized element + skipToEndElement(in); + } + } + + in.close(); + inStream.close(); + + } + catch (XMLStreamException e) { + throw new IOException(e); + } + } + + static class AnimationFrame + { + MakeTiles.TileImage frame; + int duration; + + public AnimationFrame(MakeTiles.TileImage frame, int duration) + { + this.frame = frame; + this.duration = duration; + } + } + + @Override + void drawTo(Graphics2D gr, int destX, int destY, int srcX, int srcY) + { + if (frames.isEmpty()) { return; } + frames.get(0).frame.drawTo(gr, destX, destY, srcX, srcY); + } +} diff --git a/src/micropolisj/build_tool/MakeTiles.java b/src/micropolisj/build_tool/MakeTiles.java index 665606f..df254c7 100644 --- a/src/micropolisj/build_tool/MakeTiles.java +++ b/src/micropolisj/build_tool/MakeTiles.java @@ -315,6 +315,18 @@ public class MakeTiles return pngFile; } + static TileImage loadAnimation(String fileName) + throws IOException + { + File f = new File(fileName + ".ani"); + if (f.exists()) { + return Animation.load(f); + } + else { + return loadImage(fileName); + } + } + static SourceImage loadImage(String fileName) throws IOException {