package rescuecore2.standard.view;
import javax.swing.Timer;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
/**
A viewer for StandardWorldModels.
*/
public class AnimatedWorldModelViewer extends StandardWorldModelViewer {
private static final int FRAME_COUNT = 10;
private static final int ANIMATION_TIME = 750;
private static final int FRAME_DELAY = ANIMATION_TIME / FRAME_COUNT;
private AnimatedHumanLayer humans;
private Timer timer;
private final Object lock = new Object();
private boolean done;
/**
Construct an animated world model viewer.
*/
public AnimatedWorldModelViewer() {
super();
timer = new Timer(FRAME_DELAY, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
synchronized (lock) {
if (done) {
return;
}
done = true;
if (humans.nextFrame()) {
done = false;
repaint();
}
}
}
});
timer.setRepeats(true);
timer.start();
}
@Override
public String getViewerName() {
return "Animated world model viewer";
}
@Override
public void addDefaultLayers() {
addLayer(new BuildingLayer());
addLayer(new RoadLayer());
addLayer(new AreaNeighboursLayer());
addLayer(new RoadBlockageLayer());
addLayer(new BuildingIconLayer());
humans = new AnimatedHumanLayer();
addLayer(humans);
CommandLayer commands = new CommandLayer();
addLayer(commands);
commands.setRenderMove(false);
addLayer(new PositionHistoryLayer());
}
@Override
public void view(Object... objects) {
super.view(objects);
synchronized (lock) {
done = false;
humans.computeAnimation(FRAME_COUNT);
}
}
}