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
|
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);
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Reference in a new issue