TileImages: auto-redraw animated tiles

This commit is contained in:
Jason Long 2014-06-19 21:47:33 -04:00
parent 9c5c41e0f4
commit 4dc9194fe4
5 changed files with 57 additions and 17 deletions

View file

@ -14,6 +14,9 @@ package micropolisj.engine;
*/ */
public interface MapListener public interface MapListener
{ {
/** Called on every tick of the simulation. */
void mapAnimation();
/** Called whenever data for a specific overlay has changed. */ /** Called whenever data for a specific overlay has changed. */
void mapOverlayDataChanged(MapState overlayDataType); void mapOverlayDataChanged(MapState overlayDataType);

View file

@ -305,6 +305,13 @@ public class Micropolis
} }
} }
void fireMapAnimation()
{
for (MapListener l : mapListeners) {
l.mapAnimation();
}
}
void fireMapOverlayDataChanged(MapState overlayDataType) void fireMapOverlayDataChanged(MapState overlayDataType)
{ {
for (MapListener l : mapListeners) { for (MapListener l : mapListeners) {
@ -2480,6 +2487,7 @@ public class Micropolis
} }
} }
} }
fireMapAnimation();
} }
public int getCityPopulation() public int getCityPopulation()

View file

@ -27,6 +27,7 @@ public class MicropolisDrawingArea extends JComponent
Micropolis m; Micropolis m;
boolean blinkUnpoweredZones = true; boolean blinkUnpoweredZones = true;
HashSet<Point> unpoweredZones = new HashSet<Point>(); HashSet<Point> unpoweredZones = new HashSet<Point>();
HashSet<CityLocation> animatedTiles = new HashSet<CityLocation>();
boolean blink; boolean blink;
Timer blinkTimer; Timer blinkTimer;
ToolCursor toolCursor; ToolCursor toolCursor;
@ -196,11 +197,15 @@ public class MicropolisDrawingArea extends JComponent
} }
} }
Image img = tileImages.getTileImage(cell, m.getAnimationCycle()); TileImages.ImageInfo imgInfo = tileImages.getTileImageInfo(cell, m.getAnimationCycle());
gr.drawImage(img, gr.drawImage(imgInfo.getImage(),
x*TILE_WIDTH + (shakeStep != 0 ? getShakeModifier(y) : 0), x*TILE_WIDTH + (shakeStep != 0 ? getShakeModifier(y) : 0),
y*TILE_HEIGHT, y*TILE_HEIGHT,
null); 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)); 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 //implements MapListener
public void tileChanged(int xpos, int ypos) public void tileChanged(int xpos, int ypos)
{ {

View file

@ -500,6 +500,11 @@ public class OverlayMapView extends JComponent
{ {
} }
//implements MapListener
public void mapAnimation()
{
}
//implements MapListener //implements MapListener
public void tileChanged(int xpos, int ypos) public void tileChanged(int xpos, int ypos)
{ {

View file

@ -186,39 +186,49 @@ public class TileImages
public int getTileImageNumber(int tileNumber) 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 & LOMASK) == tileNumber;
assert tileNumber >= 0 && tileNumber < tileImageMap.length; assert tileNumber >= 0 && tileNumber < tileImageMap.length;
TileImage ti = tileImageMap[tileNumber]; TileImage ti = tileImageMap[tileNumber];
if (ti instanceof SimpleTileImage) { if (ti instanceof SimpleTileImage) {
return ((SimpleTileImage) ti).imageNumber; final SimpleTileImage sti = (SimpleTileImage) ti;
return new ImageInfo(sti.imageNumber, false);
} }
else if (ti instanceof AnimatedTile) { else if (ti instanceof AnimatedTile) {
AnimatedTile anim = (AnimatedTile) ti; final AnimatedTile anim = (AnimatedTile) ti;
return anim.getFrameByTime(acycle).imageNumber; final SimpleTileImage sti = anim.getFrameByTime(acycle);
return new ImageInfo(sti.imageNumber, true);
} }
else { else {
assert false; 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) public Image getTileImage(int tile)
{ {
return getTileImage(tile, 0); return getTileImageInfo(tile, 0).getImage();
} }
private Image [] loadTileImages(String resourceName, int srcSize) private Image [] loadTileImages(String resourceName, int srcSize)