簡體   English   中英

游戲的主菜單

[英]Main menu for a game

我是一個嘗試創造游戲的初學者。 游戲是空的,我沒有開始寫它。

我的問題:當我點擊開始按鈕時,我想在相同的框架中啟動游戲,但是當我點擊開始時,使用此代碼打開程序打開另一個框架,並在原始框架中刪除面板。

我該怎么做這個簡單的菜單?

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){}     
}

}

根據您的需要,我會看到兩種選擇。 您可以從框架中刪除所有組件並添加新內容。 但通過這樣做,你失去了'菜單框架'。 另一種選擇(以及兩者中最好的IMO)是選擇CardLayout ,其中一張卡是您的菜單,另一張是您的游戲。 然后,“開始”按鈕將簡單地從“菜單卡”切換到“游戲卡”(如果需要,則啟動游戲)。 在你的游戲中,你可以有一個按鈕/鍵/ ...反向(從游戲卡切換到菜單卡)

我正在閱讀你的代碼,但我放棄了(當然,因為@orzechowskid已經指出了你需要調整的內容)。 一些提示,以防您要在此網站上發布更多代碼:

  1. 閱讀SSCCE.org網站並嘗試按照其中的描述發布代碼
  2. 遵循Java命名約定 (例如,類以大寫字母開頭,變量使用小寫字母)
  3. 不要為自己的類提供與標准JDK類相同的名稱。 對於不熟悉您的代碼(但可能比較熟悉JDK類)的人來說,閱讀代碼非常困難。 我花了一些時間才意識到你有自己的panelimage.Image類與java.awt.Image類無關

然后根據我看到的代碼,提供一些與Swing相關的技巧:

  1. 學習如何使用LayoutManager並擺脫null布局。 布局管理器可視化指南可能是一個很好的起點
  2. Swing旨在與KeyBindings一起使用,而不是與KeyListeners一起使用。 請參閱教程
  3. 注意Thread.sleep用法,並結合Swing UI運行多個Thread 確保您了解Swing線程規則

當您在按鈕的動作偵聽器中調用SwingUtilities.invokeLater() ,您將創建第二個Project0對象。 每當你創建一個Project0 ,你會在屏幕上繪制一個JFrame,里面有一個主菜單。 刪除對SwingUtilities.invokeLater()的調用,你應該留下一個幀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM