/* Copyright 2006 by Daniel Kuebrich Licensed under the Academic Free License version 3.0 See the file "LICENSE" for more information */ // Class Entity package sim.app.keepaway; import sim.util.*; import sim.portrayal.simple.*; import java.awt.*; public abstract /*strictfp*/ class Entity extends OvalPortrayal2D { private static final long serialVersionUID = 1; public MutableDouble2D loc, velocity, bump; public MutableDouble2D force = new MutableDouble2D(); public MutableDouble2D accel = new MutableDouble2D(); public MutableDouble2D newLoc = new MutableDouble2D(); public MutableDouble2D sumVector = new MutableDouble2D(0,0); public double speed, radius; public double cap; public double mass; // Accessors for inspector public double getX() { return loc.x; } public void setX( double newX ) { loc.x = newX; } public double getY() { return loc.y; } public void setY( double newY ) { loc.y = newY; } public double getVelocityX() { return velocity.x; } public void setVelocityX( double newX ) { velocity.x = newX; } public double getVelocityY() { return velocity.y; } public void setVelocityY( double newY ) { velocity.y = newY; } public double getSpeed() { return speed; } public void setSpeed( double newSpeed ) { speed = newSpeed; } public double getRadius() { return radius; } public void setRadius( double newRadius ) { radius = newRadius; scale = 2 * radius; // so our ovalportrayal knows how to draw/hit us right } public double getMass() { return mass; } public void setMass( double newMass ) { mass = newMass; } // Constructor public Entity( double newX, double newY, double newRadius, Color c ) { super(c, newRadius * 2); // scale is twice the radius loc = new MutableDouble2D(newX, newY); velocity = new MutableDouble2D(0, 0); bump = new MutableDouble2D(0, 0); radius = newRadius; mass = 1.0; cap = 1.0; speed = 0.4; } public boolean isValidMove( final Keepaway keepaway, final MutableDouble2D newLoc) { Bag objs = keepaway.fieldEnvironment.getNeighborsWithinDistance(new Double2D(loc.x, loc.y), 10); double dist = 0; // check objects for(int x=0; x<objs.numObjs; x++) { if(objs.objs[x] != this) { dist = ((Entity)objs.objs[x]).loc.distance(newLoc); if((((Entity)objs.objs[x]).radius + radius) > dist) // collision! return false; } } // check walls if(newLoc.x > keepaway.xMax) { if (velocity.x > 0) velocity.x = -velocity.x; return false; } else if(newLoc.x < keepaway.xMin) { if (velocity.x < 0) velocity.x = -velocity.x; return false; } else if(newLoc.y > keepaway.yMax) { if (velocity.y > 0) velocity.y = -velocity.y; return false; } else if(newLoc.y < keepaway.yMin) { if (velocity.y < 0) velocity.y = -velocity.y; return false; } // no collisions: return, fool return true; } public void capVelocity() { if(velocity.length() > cap) velocity = velocity.resize(cap); } }