2012-05-08 160 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){}  
} 

}当你调用SwingUtilities.invokeLater()您的按钮的动作监听器里

回答

2

我看到两个选项,根据您的需要。您可以从框架中删除所有组件并添加新内容。但是通过这样做,你就失去了“菜单框架”。另一个选项(IMO和两者中最好的)是选择CardLayout,其中一张牌是你的菜单,另一张是你的游戏。然后,'开始'按钮就可以简单地从“菜单卡”切换到“游戏卡”(如果需要,也可以开始游戏)。在你的游戏中,你可以有一个按钮/键/ ...这反过来(从游戏卡切换到菜单卡)

我正在通过你的代码,但我放弃了(当然,因为@orzechowskid已经指出你需要调整)。在案件的一些技巧你要张贴在这个网站更多的代码:

  1. 阅读SSCCE.org网站,并尝试发布的代码,因为
  2. 描述按照Java naming conventions(如类以大写字母,变量用小写字母表示)
  3. 不要给自己的类使用与标准JDK类相同的名称。对于不熟悉代码的人(但可能对JDK类非常熟悉)很难阅读代码。例如。我花了一些时间才意识到你有自己的panelimage.Image类无关与java.awt.Image

,然后根据我所看到的你的代码的几个摇摆相关的提示:

  1. 了解如何使用LayoutManager s并摆脱null布局。 Visual guide to layout managers可能是一个很好的起点
  2. Swing设计用于使用KeyBindings而不使用KeyListeners。请参阅tutorial
  3. 请注意Thread.sleep的使用情况,并将多个Thread与Swing UI结合使用。请确保您知道Swing threading rules
1

,你要创建一个第二Project0对象。每当你创建一个Project0,你就会在屏幕上绘制一个带有主菜单的JFrame。取消对SwingUtilities.invokeLater()的呼叫,您应该留下一个框架。