import java.awt.*;
import java.awt.image.*;
import java.math.*;

class AnimatedSprite extends Sprite {
              int frames;         // frames in sprite
              int[][] frameArray; // holds frame images
              private int curFrame=0;
              int frameWidth, frameHeight;
              int startx=x, endx=x, starty=y, endy=y;
              int counter=0; 
              boolean move = false;                             

	public AnimatedSprite(Image images, int numframes)
	{
		 super(images);		 //grabs the whole image
		 frameArray=new int[numframes][width*height];
	     frames = numframes;
		 for (int i=0; i < frames; i++)
		 {
			try {			
			//grap separate frame images of the whole image
        	    PixelGrabber grabber = new PixelGrabber(images,
            	width/frames*i, 0, width/frames, -1, true);
	            if (grabber.grabPixels()) {
    	            frameWidth = grabber.getWidth();
        	        frameHeight = grabber.getHeight();
            	    frameArray[i] = (int []) grabber.getPixels();              
            	}
        		} catch (InterruptedException e) { }
		}
	}

	public void nextState()
	{
	 //calculates the next position of the moving sprite
		int dx;
		int dy;
		if (move)
		{
			if ((endx-startx)!=0)
				int slope = Math.abs((endy-starty)/(endx-startx));			
			else
			{  //move vertically
				dx=0;
				slope = 1;
			}
		
			if (endx<startx)
				dx=-10;  //move back
			else
				dx=10;   //move fwd
			if (endy<starty)
				dy=-10;
			else
				dy=10;
				
			dy=dy*slope;

		  	if (counter < 10)  //move in 10 steps towards new position
				{
					x=x+dx;
					y=y+dy;
					counter++;
				}
			else
				{  //reset for next move
					move=false;
					counter = 0;
				}
		}
	}
	
	public void Draw(Raster bgnd)
	{		
		pixels=frameArray[curFrame];
		width=frameWidth;
		height=frameHeight;
		super.Draw(bgnd);
		curFrame = (curFrame + 1) % frames;  //draws the next frame of animation
	}
}
