/** * Copyright (C) 2002-2012 The FreeCol Team * * This file is part of FreeCol. * * FreeCol is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * FreeCol is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with FreeCol. If not, see <http://www.gnu.org/licenses/>. */ package net.sf.freecol.client.gui.animation; import java.awt.Rectangle; import javax.swing.ImageIcon; import javax.swing.JLabel; import net.sf.freecol.client.gui.GUI; import net.sf.freecol.client.gui.OutForAnimationCallback; import net.sf.freecol.common.io.sza.AnimationEvent; import net.sf.freecol.common.io.sza.ImageAnimationEvent; import net.sf.freecol.common.io.sza.SimpleZippedAnimation; import net.sf.freecol.common.model.Location; import net.sf.freecol.common.model.Unit; /** * Class for in-place animation of units. */ public final class UnitImageAnimation { private final Unit unit; private final SimpleZippedAnimation animation; private final Location currentLocation; private GUI gui; /** * Constructor * @param unit The unit to be animated. * @param animation The animation. */ public UnitImageAnimation(GUI gui, Unit unit, SimpleZippedAnimation animation) { this.gui = gui; this.unit = unit; this.currentLocation = unit.getLocation(); this.animation = animation; } /** * Do the animation. */ public void animate() { if (gui.getTilePosition(unit.getTile()) == null) { return; } // Painting the whole screen once to get rid of disposed dialog-boxes. gui.paintImmediatelyCanvasInItsBounds(); gui.executeWithUnitOutForAnimation(unit, unit.getTile(), new OutForAnimationCallback() { public void executeWithUnitOutForAnimation(final JLabel unitLabel) { for (AnimationEvent event : animation) { long time = System.nanoTime(); if (event instanceof ImageAnimationEvent) { final ImageAnimationEvent ievent = (ImageAnimationEvent) event; final ImageIcon icon = (ImageIcon) unitLabel.getIcon(); icon.setImage(ievent.getImage()); gui.paintImmediatelyCanvasIn(getDirtyAnimationArea()); time = ievent.getDurationInMs() - (System.nanoTime() - time) / 1000000; if (time > 0) { try { Thread.sleep(time); } catch (InterruptedException ex) { //ignore } } } } } }); } protected Rectangle getDirtyAnimationArea() { return gui.getTileBounds(currentLocation.getTile()); } }