package javaforum.org.pingpong;
import java.awt.Dimension;
import java.util.HashMap;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JFrame;
import acm.graphics.GCanvas;
import acm.graphics.GLine;
import acm.graphics.GObject;
import acm.graphics.GOval;
import acm.graphics.GRect;
@SuppressWarnings("serial")
public class PingPongView extends JFrame implements Observer {
private HashMap<ObservableObject, GObject> observerObjects;
public PingPongView(PingPongModel model) {
setTitle("Ping Pong");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GCanvas panel = new GCanvas();
panel.setPreferredSize(new Dimension(Settings.PANEL_SIZE * 2, Settings.PANEL_SIZE));
add(panel);
GLine line = new GLine(Settings.PANEL_SIZE, 0, Settings.PANEL_SIZE, Settings.PANEL_SIZE);
line.setColor(Settings.LINE_COLOR);
panel.add(line);
observerObjects = new HashMap<ObservableObject, GObject>();
PaddleView paddle1 = new PaddleView(Settings.PADDLE_WIDTH, Settings.PADDLE_HEIGHT, model.getPaddle(Player.ONE).getX(), model.getPaddle(Player.ONE).getY());
panel.add(paddle1);
observerObjects.put(model.getPaddle(Player.ONE), paddle1);
PaddleView paddle2 = new PaddleView(Settings.PADDLE_WIDTH, Settings.PADDLE_HEIGHT, model.getPaddle(Player.TWO).getX(), model.getPaddle(Player.TWO).getY());
panel.add(paddle2);
observerObjects.put(model.getPaddle(Player.TWO), paddle2);
BallView ball = new BallView(Settings.BALL_RADIUS*2, Settings.BALL_RADIUS*2, model.getBall().getX(), model.getBall().getY());
panel.add(ball);
observerObjects.put(model.getBall(), ball);
pack();
}
@Override
public void update(Observable arg0, Object arg1) {
ObservableObject observableObject = (ObservableObject)arg1;
GObject observerObject = observerObjects.get(observableObject);
observerObject.setLocation(observableObject.getX(), observableObject.getY());
}
private class PaddleView extends GRect {
public PaddleView(int sizeX, int sizeY, int posX, int posY) {
super(sizeX, sizeY);
setLocation(posX, posY);
setFilled(true);
setFillColor(Settings.PADDLE_COLOR);
setColor(Settings.PADDLE_COLOR);
}
@Override
public void setLocation(double x, double y) {
super.setLocation(x - Settings.PADDLE_WIDTH/2, y - Settings.PADDLE_HEIGHT/2);
}
}
private class BallView extends GOval {
public BallView(int sizeX, int sizeY, int posX, int posY) {
super(sizeX, sizeY);
setLocation(posX, posY);
setFilled(true);
setFillColor(Settings.BALL_COLOR);
setColor(Settings.BALL_COLOR);
}
@Override
public void setLocation(double x, double y) {
super.setLocation(x - Settings.BALL_RADIUS, y - Settings.BALL_RADIUS);
}
}
}