2012-05-08 2 views
1

Я начинаю пытаться создать игру. Игра пуста, я не начал ее писать.Главное меню к игре

Моя проблема: когда я нажимаю кнопку «Пуск», я хочу начать игру в том же фрейме, но с этим кодом, когда я нажму на кнопку «Пуск», программа откроет другой кадр с помощью меню и в исходном кадре удалит панель.

Как я могу сделать это простое меню?

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.io.File; 
import panelimage.Image; 

public class Project0 extends JFrame{ 
private static final long serialVersionUID = 1L; 
private Game JPanelGame; 
private Image MainMenu = new Image(new File("src/img/menu_background.jpg")); 
JButton start = new JButton("START GAME"), exit = new JButton ("LEAVE GAME"); 

public Project0() { 

    super(); 

    initFrame(); 
    initMenu(); 

    this.addKeyListener(new KeyAdapter() { 

     public void keyPressed(KeyEvent evt) { 
      JPanelGame.keyPressed(evt); 
     } 

     public void keyReleased(KeyEvent evt) { 
      JPanelGame.keyReleased(evt); 
     }    
    }); 

} 


private void initFrame() { 

    setResizable(false); 
    setBounds(new Rectangle(400, 400, 600, 400)); 
    MainMenu.setLayout(new BorderLayout()); 
} 


private void initMenu() { 

    initButtons(); 

    MainMenu.setLayout(null);  
    MainMenu.add(start); 
    MainMenu.add(exit); 

    add(MainMenu);  
    setContentPane(MainMenu); 

    setTitle("Project0"); 

} 

private void initButtons() { 

    start.addActionListener(new ActionListener() { 

     public void actionPerformed(ActionEvent e){ 

      JPanelGame = new Game(); 

      remove(MainMenu); 

      add(JPanelGame, BorderLayout.CENTER); 
      setContentPane(JPanelGame); 

      invalidate(); validate(); 

      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        Project0 Game = new Project0(); 
        Game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        Game.setVisible(true); 
       } 
      }); 
     } 
    });  

    start.setLocation(225,100); 
    start.setSize(150,50); 

    exit.addActionListener(new ActionListener() { 

     public void actionPerformed(ActionEvent e){ 

      System.exit(0); 
     } 
    }); 

    exit.setLocation(225,200); 
    exit.setSize(150,50);  

} 


public static void main(String[] args) {  
    Project0 Game = new Project0(); 
    Game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    Game.setVisible(true); 

} 

}

и этот кадр начнется

import java.awt.*; 
import java.awt.event.KeyEvent; 
import javax.swing.*; 

import java.io.File; 
import javax.imageio.ImageIO; 
import java.awt.image.BufferedImage; 

import highscores.*; 


public class Game extends JPanel implements Runnable { 

private static final long serialVersionUID = 1L;  

Thread game; 
BufferedImage background; 
HighscoreManager scores = new HighscoreManager(); 

public Game(){ 

    super(true); 
    try{ 
     background = ImageIO.read(new File("")); 
    }catch(Exception e) {} 


    game=new Thread(this); 
    game.start(); 
} 

public void paintComponent(Graphics graphic2d){ 

    setOpaque(false);  
    super.paintComponent(graphic2d);  

    graphic2d.drawImage(background, 0, 0, null); 
} 

public void keyPressed(KeyEvent e) { 

    int key = e.getKeyCode(); 

    if (key == KeyEvent.VK_LEFT) { 

    } 

    if (key == KeyEvent.VK_RIGHT) { 

    } 

    if (key == KeyEvent.VK_UP) { 

    } 

    if (key == KeyEvent.VK_DOWN) { 

    } 

    if (key == KeyEvent.VK_A) { 

    } 

    if (key == KeyEvent.VK_D) { 

    } 

    if (key == KeyEvent.VK_W) { 

    } 

    if (key == KeyEvent.VK_S) { 

    } 
} 

public void keyReleased(KeyEvent e) { 

    int key = e.getKeyCode(); 

    if (key == KeyEvent.VK_LEFT) { 

    } 

    if (key == KeyEvent.VK_RIGHT) { 

    } 

    if (key == KeyEvent.VK_UP) { 

    } 

    if (key == KeyEvent.VK_DOWN) { 

    } 

    if (key == KeyEvent.VK_A) { 

    } 

    if (key == KeyEvent.VK_D) { 

    } 

    if (key == KeyEvent.VK_W) { 

    } 

    if (key == KeyEvent.VK_S) { 

    } 
} 


public void run(){ 

     try {Thread.sleep(50);}catch(InterruptedException ex){}  
} 

}

ответ

2

Я вижу два варианта, в зависимости от ваших потребностей. Либо вы просто удалите все компоненты из фрейма и добавьте новое содержимое. Но тем самым вы теряете свой «меню-кадр». Другой вариант (и ИМО - лучший из двух) - выбрать CardLayout, где одна карта - это ваше меню, а другая ваша игра. Затем кнопка «старт» просто переключается с «меню-карты» на «игру-карту» (и при необходимости запускает игру). В вашей игре у вас может быть кнопка/клавиша/... которая делает инверсию (переход с игровой карты на карточку меню)

Я просматривал ваш код, но я сдался (конечно, поскольку @orzechowskid уже указал, что вам нужно настроить). Несколько советов в случае, если вы собираетесь размещать больше кода на этом сайте:

  1. Читать SSCCE.org сайт и стараться размещать код, как описано там
  2. Следуйте Java naming conventions (например, занятия начинаются с заглавной буквы, переменные с строчной буквой)
  3. Не указывайте свои собственные классы тем же именам, что и стандартные классы JDK. Это делает очень трудным для кого-то, не знакомого с вашим кодом (но, вероятно, довольно знакомого с классами JDK), прочитать код. Например. мне потребовалось некоторое время, прежде чем я понял, у вас есть свой собственный panelimage.Image класс, который не имеет ничего общего с java.awt.Image класса

а затем несколько советов, связанных с Swing, основанные на том, что я видел код:

  1. Узнайте, как использовать LayoutManager и избавиться от макетов null. Visual guide to layout managers может быть хорошей отправной точкой
  2. Swing предназначен для работы с KeyBindings, а не с KeyListeners. См. tutorial
  3. Будьте внимательны при использовании Thread.sleep и используете несколько Thread s в сочетании с пользовательским интерфейсом Swing. Убедитесь, что вы знаете о Swing threading rules
1

при вызове SwingUtilities.invokeLater() внутри действий слушателя вашего баттона, вы создаете второй Project0 объект. И всякий раз, когда вы создаете Project0, вы получаете JFrame, нарисованный на экране, с главным меню внутри него. Удалите вызов SwingUtilities.invokeLater(), и вам нужно оставить один кадр.

Смежные вопросы