import java.awt.*;
import java.awt.image.*;
import java.applet.*;
import java.util.Vector;
import java.util.Enumeration;

public class Proj1 extends Applet implements Runnable {

  private Playfield playfield;
	private Vector sprites;
	private Image imageToDraw;
	private Thread world;
	private Sprite activeSprite = null;
	private AnimatedSprite magnet = null;
   
  public void init()
	{
		sprites = new Vector(8);
		Image bgimage = getImage(getDocumentBase(), "images\\back.jpg");
		playfield = new Playfield(bgimage);
	};
	
  public void start()
	{
  	world = new Thread(this);
    world.start();
  }

  public void stop()
	{
    world = null;
  }	
	
	private void addSprite (Sprite s)
	{
		sprites.addElement(s);
	};
  
	private void deleteSprite (Sprite s)
	{
		sprites.removeElement(s);
	};
	
	public void update(Graphics g)
	{
		paint(g);
	};
	
	public void paint(Graphics g)
	{
	  g.drawImage(imageToDraw, 0, 0, this);
	};
	
	private boolean renderWorld ()
	{
		playfield.draw();
		for (Enumeration e = sprites.elements(); e.hasMoreElements();)
		{
			Sprite s = (Sprite)e.nextElement();
			s.draw(playfield);
		};
		imageToDraw = playfield.toImage();
		repaint();
		return true;
	}
	

	
	public boolean mouseMove(Event e, int x, int y)
	{
		if (activeSprite!=null)
			activeSprite.setXY(x,y);
		return(true);
	};
	
	public boolean mouseDown(Event e, int x, int y)
	{
		Sprite s;
		for (int i=0; i<sprites.size(); i++)
		{
			s = (Sprite)sprites.elementAt(i);
			if (s.touch(x,y))
			{
				if (activeSprite==s)
					activeSprite = null;
				else
					activeSprite = s;
				return(true);
			};
		};
		if (activeSprite!=null)
		{
			activeSprite.setXY(x,y);
			activeSprite.setState("default");
			activeSprite = null;
		};
		return(true);
	};
	
  public void run ()
	{
		Image[] imgs = null;
						
		imgs = new Image[1];
		imgs[0] = getImage(getDocumentBase(), "images\\s1_1.gif");
		AnimatedSprite pig = new AnimatedSprite(imgs, 10, -1);
		pig.setXY(100,100);
		addSprite(pig);
				
		imgs = new Image[5];
		imgs[0] = getImage(getDocumentBase(), "images\\s3_1.gif");
		imgs[1] = getImage(getDocumentBase(), "images\\s3_2.gif");
		imgs[2] = getImage(getDocumentBase(), "images\\s3_3.gif");
		imgs[3] = getImage(getDocumentBase(), "images\\s3_4.gif");
		imgs[4] = getImage(getDocumentBase(), "images\\s3_5.gif");
		AnimatedSprite runner = new AnimatedSprite(imgs, 2, -1);
		runner.setXY(200,200);
		addSprite(runner);
		
		imgs = new Image[7];
		imgs[0] = getImage(getDocumentBase(), "images\\rect0.gif");
		imgs[1] = getImage(getDocumentBase(), "images\\rect15.gif");
		imgs[2] = getImage(getDocumentBase(), "images\\rect30.gif");
		imgs[3] = getImage(getDocumentBase(), "images\\rect45.gif");
		imgs[4] = getImage(getDocumentBase(), "images\\rect30.gif");
		imgs[5] = getImage(getDocumentBase(), "images\\rect15.gif");
		imgs[6] = getImage(getDocumentBase(), "images\\rect0.gif");
		AnimatedSprite rectangle = new AnimatedSprite(imgs, 3, -1);
		rectangle.setXY(300,150);
		addSprite(rectangle);
		
		imgs = new Image[6];
		imgs[0] = getImage(getDocumentBase(), "images\\magnet1.gif");
		imgs[1] = getImage(getDocumentBase(), "images\\magnet2.gif");
		imgs[2] = getImage(getDocumentBase(), "images\\magnet3.gif");
		imgs[3] = getImage(getDocumentBase(), "images\\magnet4.gif");
		imgs[4] = getImage(getDocumentBase(), "images\\magnet5.gif");
		imgs[5] = getImage(getDocumentBase(), "images\\magnet6.gif");
		magnet = new AnimatedSprite(imgs, 2, -1);
		addSprite(magnet);
		magnet.setXY(100,150);

		while (true)
		{
	   	try {world.sleep(100);} catch (InterruptedException e) {}
			for (Enumeration e = sprites.elements(); e.hasMoreElements();)
			{
				Sprite s = (Sprite)e.nextElement();
				if (s.clockTick(magnet))
					sprites.removeElement(s);
			}	
      renderWorld();
			repaint();
    };
	};
	
};