001    package components;
002    
003    import java.util.Map;
004    
005    import physics3d.Angle;
006    import physics3d.GameConstants;
007    import physics3d.Vect3;
008    
009    /**
010     * <p>
011     * A LeftFlipper extends Flipper, and flips in the left direction.
012     * </p>
013     * 
014     * A LeftFlipper has no unique properties that its parent does not have.  The only stipulation is that 
015     * it has a negative Z_HAT Orientation Vector, as opposed to the positive Z_HAT Orientation Vector found
016     * in a RightFlipper.
017     *
018     */
019    
020    public class LeftFlipper extends Flipper {
021            
022            
023            public LeftFlipper(Map<String, String> props, GameSpace gs) {
024                    super(props, gs);
025                    //left flips have different orientation and angle
026                    this.setOrientVect(Vect3.Z_HAT.neg());
027                    this.setOrientAngle(Angle.ZERO.minus(orientAngle));
028            }
029    
030            /** for flippers, diff depends on orientation **/
031            @Override
032            public Vect3 getDiff() {
033                    double r = GameConstants.FLIPPER_RADIUS_FRACTION;
034                    int oa = (int)orientAngle.degrees();
035                    if (oa == 0) {
036                            return new Vect3(r, r, 0.5);
037                    } else if (oa == 90) {
038                            return (new Vect3(r, r, 0.5));
039                    } else if (oa == 180) {
040                            return (new Vect3(2-r, 2-r, 0.5));
041                    } else if (oa == -90) {
042                            return (new Vect3(2-r, 2-r, 0.5));
043                    } else {
044                            throw new IllegalArgumentException("orientAngle must be 0, 90, 180, or 270 degrees, it is " + orientAngle.degrees());
045                    }
046            }
047            
048            //See super class
049            public void getBasicPropertyMap(Map<String,String> m) {
050                    if (this.orientAngle.degrees() == -90) {
051                            m.put("orientation", "270");
052                    } else {
053                            m.put("orientation", Integer.toString((int)Math.round(this.orientAngle.degrees())));
054                    }
055                    super.getBasicPropertyMap(m);
056            }
057            
058            public GameObjectClassification getGOClassification() {
059                    return GameObjectClassification.LEFTFLIPPER;
060            }
061    }