001    package components;
002    import java.rmi.RemoteException;
003    import java.util.HashSet;
004    import java.util.List;
005    import java.util.Map;
006    import java.util.Set;
007    
008    import physics3d.Angle;
009    import physics3d.GamePhysics;
010    import physics3d.OldGamePhysics;
011    import physics3d.Shape;
012    import physics3d.Vect3;
013    
014    /**
015     * A Ball is a mutable object that bounces around the GameSpace 
016     */
017    
018    /*
019     * Abstraction Function
020     * AF(r) = a Ball, b
021     */
022    
023    /*
024     * Representation Invariant
025     * 
026     * Ball's position is inside the GameSpace of the Ball, 
027     * as specified by the Walls of the GameSpace
028     */
029    
030    public class Ball extends GameObject {
031    
032            //Constructors  
033            /**
034             * @effects Contructs new Ball
035             */
036            public Ball(Vect3 tlf, Vect3 velocity, Vect3 ov, Angle oa, String name, GameSpace g) {
037                    super(tlf, velocity, ov,oa,name,g);
038                    this.shape = Shape.getBallShape();
039                    center = tlf;
040            }
041    
042            /**
043             * @effects Constructs a new Ball
044             */
045            public Ball(Vect3 tlf, Vect3 velocity, String name, GameSpace g) {
046                    this(tlf, velocity, Vect3.Z_HAT, Angle.ZERO, name, g);
047            }
048    
049            /**
050             * @effects Constructs a new Ball
051             */
052            public Ball(Vect3 tlf, String name, GameSpace g) {
053                    this(tlf, Vect3.ZERO, name, g);
054            }
055            
056            //methods
057            
058            public Ball(Map<String, String> p, GameSpace g) {
059                    super(p, g);
060            }
061    
062            /** in order for the ball to be in the middle of a grid, the center is offset by .5 from the tlf on the z axis**/
063            @Override
064            public Vect3 getDiff() {
065                    return Vect3.ZERO;
066            }
067            
068            /** balls have the same center and tlf, so don't do that thar rounding thing **/
069            @Override
070            public Vect3 getTLF() {
071                    return center.minus(getDiff());
072            }
073            
074            @Override
075            protected Map<String, String> defaults() {
076                    Map<String, String> smap = super.defaults();
077                    smap.put("frozen", "false");
078                    return smap;
079            }
080            
081            @Override 
082            /**
083             * @effects finds what the Ball collides with and tells what the Ball hits to 
084             * respond appropriately
085             */
086            public void stepFrame() {
087                    List<GameObject> collisions = GamePhysics.moveBall(this);
088                    
089                    for (GameObject o : collisions)
090                            o.onCollision(this);
091            }
092            
093            /**
094             * @return the GameObjectClassification of this object
095             */
096            public GameObjectClassification getGOClassification() {
097                    return GameObjectClassification.BALL;
098            }
099            
100            //See parent class
101            public void getBasicPropertyMap(Map<String,String> m) {
102                    super.getBasicPropertyMap(m);
103                    GameObject.putInVect3(velocity, m, "Velocity",false);
104                    GameObject.putInVect3(getCenter(), m, "",false);
105                    System.err.println("Got ball properties...center=" + getCenter().toString());
106                    System.err.println("Got ball map=" + m.toString());
107            }
108            
109            @Override
110            protected Shape shape() {
111                    return Shape.getBallShape();
112            }
113            
114            /**
115             * @return the top left front corners of the grid locations occupied by the Ball,
116             * where the x grid positions go from 0-20, y from 0-20, and z from 0-10
117             */
118            public Set<Vect3> getOccupiedPositions() {
119                    Set<Vect3> ops = new HashSet<Vect3>();
120                    Vect3 tlf = getNonRoundedTLF();
121                    int x = (int) tlf.x();
122                    int y = (int) tlf.y();
123                    int z = (int) tlf.z();
124                    Vect3 newtlf = new Vect3(x, y, z);
125                    ops.add(newtlf);
126                    return ops;
127            }
128    }