import java.util.HashMap; class Sensors { HashMap sensors; Sensors() { sensors = new HashMap(); } void registerSensor(String name, Sensor sensor) { sensors.put(name, sensor); } Sensor getSensor(String name) { return (Sensor) sensors.get(name); } } abstract class Sensor implements Drawable { abstract float getValue(); abstract void draw(); int calculatedAtFrame; } class HeightSensor extends Sensor { Plane plane; Terrain terrain; HeightSensor(Plane plane, Terrain terrain) { this.plane = plane; this.terrain = terrain; } float getValue() { float h = scene.HEIGHT - (plane.posY + terrain.heightAt((int) plane.posX)); if (h < 0) scene.crash(); return h; } void draw() { pushMatrix(); stroke(0, 0, 0, 50); translate(plane.posX, plane.posY); line(0, 0, 0, getValue()); popMatrix(); } } class PowerSensor extends Sensor { Plane plane; PowerSensor(Plane plane) { this.plane = plane; } float getValue() { return plane.power; } void draw() { } } class SpeedSensor extends Sensor { Plane plane; float oX, oY; float oSpeed; SpeedSensor(Plane plane) { this.plane = plane; } float getValue() { if( frame == calculatedAtFrame) return oSpeed; calculatedAtFrame = frame; float speed = sqrt(sq(plane.posX - oX) + sq(plane.posY - oY)); oX = plane.posX; oY = plane.posY; if(speed >= 100) return oSpeed; oSpeed = speed; return speed; } void draw() { } }