Klikbaar menu Java

Status
Niet open voor verdere reacties.

NewbiProgrammer

Gebruiker
Lid geworden
18 okt 2009
Berichten
264
Een studiegenoot van mij is bezig met een bombermanspel. Nu wil hij graag een klikbaar menu waar je kan kiezen voor nieuw spel etc. weet iemand misschien of dit mogelijk is en heeft iemand er misschien een tutorial of iets dergelijks voor?

M.v.g.
Bram
 
Hier heb je een simple framework voor een spelletje met menu balk.

Je kan een spel starten en stoppen.

Het spel zelf stelt niks voor het begint met 5 levens en elke seconde gaat er een dood.

Alles staat nu in 1 bestand, je moet de verschillende klasse later in aparte bestanden zetten,

succes,



Code:
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);
        }
    }
}
 
Bedankt voor je reactie, maar ik zoek eigenlijk iets anders.

Uitleg:
Ik heb 1 frame (het geheel) met een container. In die container wil ik, of de JPanel van het spel zelf (als ie draait) of de JPanel van het menu (als het spel is gepauzeerd of nog niet is gestart) weergeven. Alleen krijg ik een error als ik die probeer te wisselen. De BufferStrategy begint dan te flippen.
 
Volgens mij het eenvoudigste is het om een CardLayout te gebruiken.
Je kan de tussen game / menu panel flippen. door show(menu") of show("spel") van de layout aan te roepen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan