package javaapplication36;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
public class Main {
public static void main(String[] args) {
final JFrame f = new JFrame();
Controller controller = new Controller(); //de controller regelt het spelverloop.
f.setJMenuBar(controller.createMenuBar());
f.getContentPane().add(controller.createPanel());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationByPlatform(true);
f.pack();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
f.setVisible(true);
}
});
}
public static class Controller {
//dit zijn de 2 acties die je nu kan kiezen nieuw & stop spel.
private final NieuwSpelAction nieuwSpelAction;
private final StopSpelAction stopSpelAction;
private Spel spel;
private SpelView view;
private static final Dimension DEFAULT_DIMENSION = new Dimension(400, 300);
private final Timer timer;
private final JPanel paneel;
public Controller() {
nieuwSpelAction = new NieuwSpelAction(this);
stopSpelAction = new StopSpelAction(this);
//paneel is
paneel = new JPanel(new BorderLayout());
paneel.setPreferredSize(DEFAULT_DIMENSION);
//dit is de timer zorgt ervoor dat je spel elke 1 seconde de tijd krijgt om iets te doen.
timer = new Timer(1000,new ActionListener() {
public void actionPerformed(ActionEvent e) {
runSpel();
}
});
timer.start();
}
public JMenuBar createMenuBar() {
//maak eerst de losse menu aan.
JMenu fileMenu = new JMenu("Bestand");
fileMenu.add(new JMenuItem(nieuwSpelAction));
fileMenu.add(new JMenuItem(stopSpelAction));
//maak de menubalk aan en voeg de menu toe.
JMenuBar menuBar = new JMenuBar();
menuBar.add(fileMenu);
return menuBar;
}
public JPanel createPanel() {
return paneel;
}
public void nieuwSpel() {
//hier maken we een nieuwe spel aan. We maken een spel aan een view, en zorgen
//date deze nieuwe view aan het hoofdpaneel wordt toegevoegt.
spel = new Spel(this);
view = new SpelView(spel);
updateMenu();
paneel.add(view, BorderLayout.CENTER);
paneel.validate(); //het hoofdpaneel zal proberen het nieuwe view te tekenen.
}
public void gameOver() {
verwijderSpel();
JOptionPane.showMessageDialog(paneel, "Game over");
}
public void stopSpel() {
pauze(); //zet de timer even stil...
int antwoord = JOptionPane.showConfirmDialog(paneel, "Wil je stoppen ?", "Spel", JOptionPane.YES_NO_OPTION);
if (antwoord == JOptionPane.YES_OPTION) {
verwijderSpel();
}
pauze(); //zet de timer weer aan...
}
public void runSpel() {
if (spel != null) {
spel.dood(); //laat de spel zijn actie doen.
}
if (view != null) {
view.repaint(); //laat het spel scherm opnieuw teken.
}
}
public void pauze() {
if (timer.isRunning()) {
timer.stop();
} else {
timer.start();
}
}
private void verwijderSpel() {
//verwijder het huidige spel.
paneel.remove(view);
view = null;
spel = null;
updateMenu();
paneel.validate();
paneel.repaint();
}
private void updateMenu() {
//afhankel of er een spel aan de gang is zullen de menu moeten disabelen.
boolean spelIsAktief = spel != null;
nieuwSpelAction.setEnabled(!spelIsAktief);
stopSpelAction.setEnabled(spelIsAktief);
}
}
public static class NieuwSpelAction extends AbstractAction {
private Controller controller;
public NieuwSpelAction(Controller controller) {
super("Nieuw spel"); //zet de tekst van de actie
//je kan hier ook icons gebruiken en of short-cut toevoegen.
this.controller = controller;
}
public void actionPerformed(ActionEvent e) {
controller.nieuwSpel();
}
}
public static class StopSpelAction extends AbstractAction {
private Controller controller;
private StopSpelAction(Controller controller) {
super("Stop spel");
this.controller = controller;
}
public void actionPerformed(ActionEvent e) {
controller.stopSpel();
}
}
public static class Spel {
//dit spel bevat de logica van het spel. (niet veel dus)
//het tekenen van het scherm gebeurt niet hier, maar in het spel view!
private int levens;
private Controller controller;
public Spel(Controller controller) {
this.controller = controller;
levens = 5;
}
public int getLevens() {
return levens;
}
public void dood() {
levens--;
if (levens == 0) {
controller.gameOver();
}
}
}
//Hier gebeurt het teken van het spel..
public static class SpelView extends JComponent {
private final Spel spel;
public SpelView(Spel spel) {
this.spel = spel;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLACK);
g.drawString("Aantal levens : " + spel.getLevens(), 10,90);
}
}
}