import greenfoot.*; // (World, Actor, GreenfootImage, and Greenfoot)
/**
* A superclass for specific actor classes that add smooth movement functionality.
*
* Movement is based on doubles (rather than ints), and thus generates smoother
* movement for fast moving actors in high resolution worlds.
*
* The SmoothMover also implements world wrap-around: when moving out of the world at any edge,
* the actor will enter again at the opposite side.
*
* Requires class Vector.
*
* @author Poul Henriksen
*/
public abstract class SmoothMover extends Actor
{
private Vector speed = new Vector();
private double x = 0;
private double y = 0;
public SmoothMover()
{
}
/**
* Create new thing initialised with given speed.
*/
public SmoothMover(Vector speed)
{
this.speed = speed;
}
/**
* Move forward one step.
*/
public void move()
{
x = x + speed.getX();
y = y + speed.getY();
if (outOfWorld()) {
getWorld().removeObject(this);
}
else {
setLocation(x, y);
}
}
private boolean outOfWorld()
{
return (x >= getWorld().getWidth())
|| (x < 0)
|| (y >= getWorld().getHeight())
|| (y < 0) ;
}
/**
* Providing 'setLocation' based on doubles. This will eventually call
* the built-in 'setLocation' method in Actor.
*/
public void setLocation(double x, double y)
{
this.x = x;
this.y = y;
super.setLocation((int) x, (int) y);
}
/**
* Override the default 'setLocation' method to keep our own coordinates
* up-to-date.
*/
public void setLocation(int x, int y)
{
setLocation((double) x, (double) y);
}
/**
* Increase the speed with the given vector.
*/
public void increaseSpeed(Vector s)
{
speed.add(s);
}
/**
* Return the current speed.
*/
public Vector getSpeed()
{
return speed;
}
}