package NET.worlds.scape; import NET.worlds.core.Std; import java.io.IOException; public class PeriodicTimeSensor extends Sensor implements FrameHandler { private float timeInterval = 1.0F; private long lastTrigger; private static Object classCookie = new Object(); public PeriodicTimeSensor(Action act) { if (act != null) { this.addAction(act); } } public PeriodicTimeSensor() { } @Override public boolean handle(FrameEvent e) { long now = 0L; if (e == null) { now = Std.getFastTime(); } else { now = e.time; } if (now - this.lastTrigger > (long)(1000.0F * this.timeInterval)) { this.lastTrigger = now; this.trigger(e); } return true; } @Override public Object properties(int index, int offset, int mode, Object value) throws NoSuchPropertyException { Object ret = null; switch (index - offset) { case 0: if (mode == 0) { ret = FloatPropertyEditor.make(new Property(this, index, "Time Interval (s)")); } else if (mode == 1) { ret = new Float(this.timeInterval); } else if (mode == 2) { this.timeInterval = (Float)value; } break; default: ret = super.properties(index, offset + 1, mode, value); } return ret; } @Override public void saveState(Saver s) throws IOException { s.saveVersion(1, classCookie); super.saveState(s); s.saveFloat(this.timeInterval); } @Override public void restoreState(Restorer r) throws IOException, TooNewException { switch (r.restoreVersion(classCookie)) { case 1: super.restoreState(r); this.timeInterval = r.restoreFloat(); return; default: throw new TooNewException(); } } @Override public String toString() { return "*every " + this.timeInterval + " s"; } }