import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

@SuppressWarnings("serial")
public class AnimalTestG extends JFrame {
	static Polygon poly1, poly2;
	static Dog dog1;
	static Cat cat1;

	private static final int W = 800;
	private static final int H = 600;

	DrawPanel drawPanel = new DrawPanel();

	public AnimalTestG() {
		super("PolygonTestG v.1.0_0");
		ActionListener listener = new AbstractAction() {
			public void actionPerformed(ActionEvent e) {
				drawPanel.repaint();
				
				if (dog1.x > W - 140) dog1.dx *= -1;
				if (dog1.x < Math.abs(dog1.dx)) dog1.dx *= -1;
				if (dog1.y > H - 188) dog1.dy *= -1;
				if (dog1.y < Math.abs(dog1.dy)) dog1.dy *= -1;
				dog1.move();
				
				if (cat1.x > W - 50) cat1.dx *= -1;
				if (cat1.x < Math.abs(cat1.dx)) cat1.dx *= -1;
				if (cat1.y > H - 50) cat1.dy *= -1;
				if (cat1.y < Math.abs(cat1.dy)) cat1.dy *= -1;
				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();
				
			}
		};
		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
				if (evt.getKeyCode() == KeyEvent.VK_UP) {
					dog1.dy--;
				}
				if (evt.getKeyCode() == KeyEvent.VK_RIGHT) {
					dog1.dx++;
				}
				if (evt.getKeyCode() == KeyEvent.VK_DOWN) {
					dog1.dy++;
				}
				if (evt.getKeyCode() == KeyEvent.VK_LEFT) {
					dog1.dx--;
				}
				
				// cat control
				if (evt.getKeyCode() == KeyEvent.VK_W) {
					cat1.dy--;
				}
				if (evt.getKeyCode() == KeyEvent.VK_D) {
					cat1.dx++;
				}
				if (evt.getKeyCode() == KeyEvent.VK_S) {
					cat1.dy++;
				}
				if (evt.getKeyCode() == KeyEvent.VK_A) {
					cat1.dx--;
				}
				
				// 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 e) {}
		});
		
		setVisible(true);
	}

	private class DrawPanel extends JPanel {

		protected void paintComponent(Graphics g) {
			super.paintComponent(g);
			
			poly1.draw(g);
			poly1.drawString(g, 10, 10);

			dog1.draw(g);
			cat1.draw(g);
			
			poly2.draw(g);
			poly2.drawString(g, 400, 10);
		}

		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), true, false);
		cat1 = new Cat((int)(2*W/3.0 + 100), (int)(H/2.0), true, false);

		EventQueue.invokeLater(new Runnable() {
			public void run() {
				new AnimalTestG();
			}
		});
	}
}