package graphics;
import game_timer.GameTimer;
import game_timer.TimerNotify;
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Panel;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.HashMap;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import controller.Controller;
import java.io.*;
import java.lang.*;
//TODO: [peti] framebol kell szarmaztatni
public class MainGraphics extends Frame implements TimerNotify, KeyListener {
private static MainGraphics instance = null;
/**
* MainGraphics elkerese
*
* @return MainGraphics visszadasa
*/
public static MainGraphics get() {
if (instance == null) {
instance = new MainGraphics();
}
return instance;
}
protected Draw draw;
protected Canvas canvas;
protected Icon background;
protected Icon gameover;
protected Icon youwin;
protected String endText;
protected ArrayList<AbstractGraphicsObject> graphicsList = new ArrayList<AbstractGraphicsObject>();
protected HashMap<Object, AbstractGraphicsObject> graphicsTree = new HashMap<Object, AbstractGraphicsObject>();
protected Image offscreen;
protected Panel menuPanel = MenuPanel.get();
/*
* MainGraphics konstruktor: meret, listenerek beallitasa
*/
private MainGraphics() {
this.pack();
this.setFocusableWindowState(true);
this.addKeyListener(new GameKeyListener());
this.setVisible(true);
this.setSize(735, 645);
this.setLayout(new BorderLayout());
this.setResizable(false);
offscreen = createImage(735, 645);
// hozzaadjuk a listenert, hogy be lehessen zarni a frame-t
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
// majd letrehozzuk a ra rajzolando canvast
canvas = new Canvas();
canvas.setSize(735, 645);
this.add("Center", canvas);
canvas.addKeyListener(new GameKeyListener());
// beolvassuk a jatek hatteret
background = new ImageIcon("images/hatter.gif", "hatter"); // egy ilyen
gameover = new ImageIcon("images/gameover.gif", "over"); // egy ilyen
youwin = new ImageIcon("images/youwin.gif", "win"); // egy ilyen
// imageIcont
// kell
// letrehozni
// feliratkozunk a GameTimer-re
GameTimer.getInstance().registObserver(this);
// adjuk hozza a menut es rejtsuk el
this.add("Center", menuPanel);
menuPanel.setVisible(false);
}
public Frame getFrame() {
return this;
}
public Canvas getCanvas() {
return canvas;
}
/*
* A graphicsTree-hez hozzaadjuk a Graphics objektumokat
*
* @param ago Graphics objektum
*
* @param o az adott peldany, amire a Graphics vonatkozik, lehet pl auto,
* keresztezodes, ut stb...
*/
public void addGraphicsObject(AbstractGraphicsObject ago, Object o) {
graphicsList.add(ago);
graphicsTree.put(o, ago);
}
/**
* Beallitjuk az adott Draw-t
*
* @param d
* Draw
*/
public void setDraw(Draw d) {
draw = d;
}
/**
* onTick-re kirajzoljuk az osszes elemet
*/
public void onTick() {
// vegigmegyunk a Graphics-okon, es meghivjuk mindegyiknek a
// recalculateData metodusat
int l = graphicsList.size();
// toroljuk a kepernyot
// kirajzoljuk a hatteret
background.paintIcon(canvas, offscreen.getGraphics(), 0, 0);
for (int i = 0; i < l; i++) {
//
AbstractGraphicsObject absg = graphicsList.get(i);
absg.calcGraphics();
}
canvas.getGraphics().drawImage(offscreen, 0, 0, canvas);
}
/**
* A jatek vegen kiirando szoveg beallitasa
*
* @param s
* szoveg
*/
public void setEndText(String s) {
endText = s;
canvas.getGraphics().setColor(new Color(255, 255, 255));
// az offscreen-rol rajzoljuk ki a kepet, a duplabuffereles miatt
// a jatek vegein kiirando szoveg
if (s=="nyertel")
youwin.paintIcon(canvas, canvas.getGraphics(), 0, 0);
else
gameover.paintIcon(canvas, canvas.getGraphics(), 0, 0);
//canvas.getGraphics().drawImage(offscreen, 0, 0, canvas);
}
// az objektum ismeretben megkaphatjuk a Graphics osztalyat
/**
* Az objektum ismereteben megkaphatjuk a Graphics osztalat
*
* @param o
* az adott objektum: pl RobberyCar, Cross, Route stb...
* @return az adott objektum Grahpics osztalya: pl GraphicsRobberyCar,
* GraphicsRoute stb..
*/
public AbstractGraphicsObject getGraphicsFromObject(Object o) {
AbstractGraphicsObject ro = graphicsTree.get(o);
return ro;
}
/**
* Listener billentyuuzenetek elkapasahoz
*
* @author Asus
*
*/
public void menuMode() {
menuPanel.setVisible(true);
canvas.setVisible(false);
GameTimer.getInstance().stopTimer();
instance.validate();
}
public void gameMode() {
menuPanel.setVisible(false);
canvas.setVisible(true);
GameTimer.getInstance().resumeTimer();
instance.validate();
}
private class GameKeyListener extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
// ha az ESC gomb lett megnyomva
if (e.getKeyCode() == 27) {
menuMode();
} else {
// m�sk�l�nben a rabl�t szeretn�k ir�ny�tani
// kell elkapni, irom emailben miert
Controller.get().leadRobbery(e);
}
}
}
/**
* A duplabufferelesnel hasznalt offscreen Graphics-at adjuk vissza
*
* @return Graphics: offscreen Graphics-ja
*/
public Graphics getGraphic() {
return offscreen.getGraphics();
}
@Override
public void keyReleased(KeyEvent e) {
// nem hasznalt fuggveny.
}
@Override
public void keyTyped(KeyEvent e) {
// nem hasznalt fuggveny.
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == 27){
menuMode();
}
}
}