import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;

import javax.swing.*;

@SuppressWarnings("serial")
public class AnimalTestG extends JFrame {
	static ArrayList<Projectile> projectiles = new ArrayList<Projectile>();
	static Polygon poly1, poly2;
	static Dog dog1;
	static Cat cat1;

	public static final int W = 800;
	public static final int H = 600;

	DrawPanel drawPanel = new DrawPanel();

	public AnimalTestG() {
		super("AnimalTestG v.1.0_0");
		ActionListener listener = new AbstractAction() {
			public void actionPerformed(ActionEvent e) {
				drawPanel.repaint();
				
				dog1.move();
				cat1.move();
				
				poly1.rotate(0.01, poly1.computeCenter());
				//poly1.translate(1, -1);
				poly1.move();

				poly2.rotate(-0.01, poly2.computeCenter());
				//poly1.translate(1, -1);
				poly2.move();
				
				int i = 0;
				while (i < projectiles.size()) {
					Projectile p = projectiles.get(i);
					p.move();
					if (p.destroyed) {
						projectiles.remove(i);
						continue;
					}
					i++;
				}
			}
		};
		Timer timer = new Timer(1, listener);
		timer.start();

		drawPanel.setBackground(new Color(0,0,0));
		drawPanel.setForeground(new Color(0,255,0));

		add(drawPanel);

		pack();
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		
		addKeyListener(new KeyListener() {
			public void keyPressed(KeyEvent evt) {
				// dog control
				dog1.keyPressed(evt);
				
				// cat control
				cat1.keyPressed(evt);
				
				// poly1 control
				if (evt.getKeyCode() == KeyEvent.VK_T) {
					poly1.dy--;
				}
				if (evt.getKeyCode() == KeyEvent.VK_H) {
					poly1.dx++;
				}
				if (evt.getKeyCode() == KeyEvent.VK_G) {
					poly1.dy++;
				}
				if (evt.getKeyCode() == KeyEvent.VK_F) {
					poly1.dx--;
				}
				
				// poly2 control
				if (evt.getKeyCode() == KeyEvent.VK_I) {
					poly2.dy--;
				}
				if (evt.getKeyCode() == KeyEvent.VK_L) {
					poly2.dx++;
				}
				if (evt.getKeyCode() == KeyEvent.VK_K) {
					poly2.dy++;
				}
				if (evt.getKeyCode() == KeyEvent.VK_J) {
					poly2.dx--;
				}
			}
			
			public void keyTyped(KeyEvent e) {}
			
			public void keyReleased(KeyEvent evt) {
				// dog control
				dog1.keyReleased(evt);
				
				// cat control
				cat1.keyReleased(evt);
			}
		});
		
		setVisible(true);
	}

	private class DrawPanel extends JPanel {
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);
			
			poly1.draw(g);
			poly1.drawString(g, 10, 10);

			poly2.draw(g);
			poly2.drawString(g, 400, 10);
			
			dog1.draw(g);
			dog1.drawString(g, 10, H - 100);
			
			cat1.draw(g);
			cat1.drawString(g, W - 100, H - 100);	
			
			for (Projectile p : projectiles) {
				p.draw(g);
			}
		}

		public Dimension getPreferredSize() {
			return new Dimension(W, H);
		}
	}

	public static void main(String[] args) {
		Point p1, p2, p3, p4, p5, p6, p7;
		Point p11, p12, p13, p14, p15, p16, p17;

		p1 = new Point(3.5, 6);
		p2 = new Point(8, -1);
		p3 = new Point(4, -7);
		p4 = new Point(-3, -7);
		p5 = new Point(-4, -3);
		p6 = new Point(-4.5, 4);
		p7 = new Point(-2.5, 8.5);

		p11 = new Point(3.5, 6);
		p12 = new Point(8, -1);
		p13 = new Point(4, -7);
		p14 = new Point(-3, -7);
		p15 = new Point(-4, -3);
		p16 = new Point(-4.5, 4);
		p17 = new Point(-2.5, 8.5);

		poly1 = Polygon.polygonFrom(new Point[] { p1, p2, p3, p4, p5, p6, p7 });
		poly2 = Polygon.polygonFrom(new Point[] { p11, p12, p13, p14, p15, p16, p17 }, new Color (0,255,0));

		poly1.scale(20);
		poly1.translate(W/3.0, H/2.0);

		poly2.scale(20);
		poly2.translate(2*W/3.0 + 100, H/2.0);

		dog1 = new Dog((int)(W/3.0), (int)(H/2.0));
		cat1 = new Cat((int)(2*W/3.0 + 100), (int)(H/2.0));

		EventQueue.invokeLater(new Runnable() {
			public void run() {
				new AnimalTestG();
			}
		});
	}
}