TileImages: auto-redraw animated tiles
This commit is contained in:
parent
9c5c41e0f4
commit
4dc9194fe4
5 changed files with 57 additions and 17 deletions
|
@ -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);
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -500,6 +500,11 @@ public class OverlayMapView extends JComponent
|
|||
{
|
||||
}
|
||||
|
||||
//implements MapListener
|
||||
public void mapAnimation()
|
||||
{
|
||||
}
|
||||
|
||||
//implements MapListener
|
||||
public void tileChanged(int xpos, int ypos)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
|
|
Reference in a new issue