package shipmaker.knobs; import java.awt.event.MouseEvent; import java.awt.geom.AffineTransform; import java.awt.geom.NoninvertibleTransformException; import java.awt.geom.Point2D; import physics.XYTSource; import render.MouseEventType; import render.XYTRenderNode; public abstract class Knob extends XYTRenderNode implements XYTSource { float x, y; public Knob() { super(null); src = this; } public float position_x() { return x; } public float position_y() { return y; } public abstract float offset_rotation(); public float alignment_theta() { return -offset_rotation(); } Point2D last = null; boolean dragging = false; public boolean interacted(AffineTransform root, MouseEvent e, MouseEventType t) { Point2D.Float src = new Point2D.Float(); src.setLocation(e.getX(), e.getY()); try { root.invert(); } catch (NoninvertibleTransformException e1) { e1.printStackTrace(); } Point2D pt = root.transform(src, null); if (t == MouseEventType.MOUSE_PRESS && Math.abs(pt.getX()) < 10 && Math.abs(pt.getY()) < 10) { dragging = true; last = pt; pt.setLocation(pt.getX() + worldx(), pt.getY() + worldy()); } else if (dragging && t == MouseEventType.MOUSE_DRAG) { pt.setLocation(pt.getX() + worldx(), pt.getY() + worldy()); tweak((float) (pt.getX() - last.getX()), (float) (pt.getY() - last.getY()), (float) pt.getX(), (float) pt.getY()); last = pt; } else if (dragging && t == MouseEventType.MOUSE_RELEASE) { dragging = false; last = null; } else { return false; } return true; } public abstract void tweak(float dx, float dy, float worldx, float worldy); public abstract float worldx(); public abstract float worldy(); public int layer() { return 2; } }