2012-05-08 130 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()的呼叫,您應該留下一個框架。