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
{
/** Called on every tick of the simulation. */
void mapAnimation();
/** Called whenever data for a specific overlay has changed. */
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)
{
for (MapListener l : mapListeners) {
@ -2480,6 +2487,7 @@ public class Micropolis
}
}
}
fireMapAnimation();
}
public int getCityPopulation()

View file

@ -27,6 +27,7 @@ public class MicropolisDrawingArea extends JComponent
Micropolis m;
boolean blinkUnpoweredZones = true;
HashSet<Point> unpoweredZones = new HashSet<Point>();
HashSet<CityLocation> animatedTiles = new HashSet<CityLocation>();
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)
{

View file

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

View file

@ -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)