diff --git a/src/micropolisj/engine/MapListener.java b/src/micropolisj/engine/MapListener.java index 73fcade..cd6d7d0 100644 --- a/src/micropolisj/engine/MapListener.java +++ b/src/micropolisj/engine/MapListener.java @@ -14,6 +14,9 @@ package micropolisj.engine; */ public interface MapListener { + /** Called on every tick of the simulation. */ + void mapAnimation(); + /** Called whenever data for a specific overlay has changed. */ void mapOverlayDataChanged(MapState overlayDataType); diff --git a/src/micropolisj/engine/Micropolis.java b/src/micropolisj/engine/Micropolis.java index d3f9e68..8fc2669 100644 --- a/src/micropolisj/engine/Micropolis.java +++ b/src/micropolisj/engine/Micropolis.java @@ -305,6 +305,13 @@ public class Micropolis } } + void fireMapAnimation() + { + for (MapListener l : mapListeners) { + l.mapAnimation(); + } + } + void fireMapOverlayDataChanged(MapState overlayDataType) { for (MapListener l : mapListeners) { @@ -2480,6 +2487,7 @@ public class Micropolis } } } + fireMapAnimation(); } public int getCityPopulation() diff --git a/src/micropolisj/gui/MicropolisDrawingArea.java b/src/micropolisj/gui/MicropolisDrawingArea.java index 8c71581..5068852 100644 --- a/src/micropolisj/gui/MicropolisDrawingArea.java +++ b/src/micropolisj/gui/MicropolisDrawingArea.java @@ -27,6 +27,7 @@ public class MicropolisDrawingArea extends JComponent Micropolis m; boolean blinkUnpoweredZones = true; HashSet unpoweredZones = new HashSet(); + HashSet animatedTiles = new HashSet(); boolean blink; Timer blinkTimer; ToolCursor toolCursor; @@ -196,11 +197,15 @@ public class MicropolisDrawingArea extends JComponent } } - Image img = tileImages.getTileImage(cell, m.getAnimationCycle()); - gr.drawImage(img, + TileImages.ImageInfo imgInfo = tileImages.getTileImageInfo(cell, m.getAnimationCycle()); + gr.drawImage(imgInfo.getImage(), x*TILE_WIDTH + (shakeStep != 0 ? getShakeModifier(y) : 0), y*TILE_HEIGHT, null); + + if (imgInfo.isAnimated()) { + animatedTiles.add(new CityLocation(x, y)); + } } } @@ -387,6 +392,15 @@ public class MicropolisDrawingArea extends JComponent repaint(getSpriteBounds(sprite, sprite.x, sprite.y)); } + //implements MapListener + public void mapAnimation() + { + for (CityLocation loc : animatedTiles) { + repaint(getTileBounds(loc.x, loc.y)); + } + animatedTiles.clear(); + } + //implements MapListener public void tileChanged(int xpos, int ypos) { diff --git a/src/micropolisj/gui/OverlayMapView.java b/src/micropolisj/gui/OverlayMapView.java index 2a772c6..47778a8 100644 --- a/src/micropolisj/gui/OverlayMapView.java +++ b/src/micropolisj/gui/OverlayMapView.java @@ -500,6 +500,11 @@ public class OverlayMapView extends JComponent { } + //implements MapListener + public void mapAnimation() + { + } + //implements MapListener public void tileChanged(int xpos, int ypos) { diff --git a/src/micropolisj/gui/TileImages.java b/src/micropolisj/gui/TileImages.java index 2fb2f09..71b25aa 100644 --- a/src/micropolisj/gui/TileImages.java +++ b/src/micropolisj/gui/TileImages.java @@ -186,39 +186,49 @@ public class TileImages public int getTileImageNumber(int tileNumber) { - return getTileImageNumber(tileNumber, 0); + return getTileImageInfo(tileNumber, 0).imageNumber; } - public int getTileImageNumber(int tileNumber, int acycle) + public class ImageInfo + { + int imageNumber; + boolean animated; + + ImageInfo(int imageNumber, boolean animated) { + this.imageNumber = imageNumber; + this.animated = animated; + } + + Image getImage() { return images[imageNumber]; } + boolean isAnimated() { return animated; } + } + + public ImageInfo getTileImageInfo(int tileNumber, int acycle) { assert (tileNumber & LOMASK) == tileNumber; assert tileNumber >= 0 && tileNumber < tileImageMap.length; TileImage ti = tileImageMap[tileNumber]; if (ti instanceof SimpleTileImage) { - return ((SimpleTileImage) ti).imageNumber; + final SimpleTileImage sti = (SimpleTileImage) ti; + + return new ImageInfo(sti.imageNumber, false); } else if (ti instanceof AnimatedTile) { - AnimatedTile anim = (AnimatedTile) ti; - return anim.getFrameByTime(acycle).imageNumber; + final AnimatedTile anim = (AnimatedTile) ti; + final SimpleTileImage sti = anim.getFrameByTime(acycle); + + return new ImageInfo(sti.imageNumber, true); } else { assert false; - return 0; + return new ImageInfo(0, false); } } - public Image getTileImage(int tile, int acycle) - { - assert images != null; - - int imageNumber = getTileImageNumber(tile, acycle); - return images[imageNumber]; - } - public Image getTileImage(int tile) { - return getTileImage(tile, 0); + return getTileImageInfo(tile, 0).getImage(); } private Image [] loadTileImages(String resourceName, int srcSize)