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

}

4

2 に答える 2

2

ニーズに応じて、2つのオプションがあります。フレームからすべてのコンポーネントを削除して、新しいコンテンツを追加するだけです。しかしそうすることで、「メニューフレーム」が失われます。もう1つのオプション(およびIMOは2つのうちの最良のもの)はCardLayout、1つのカードがメニューで、もう1つのカードがゲームであるを選択することです。次に、「開始」ボタンは「メニューカード」から「ゲームカード」に切り替えるだけです(必要に応じてゲームを開始します)。ゲームでは、ボタン/キー/ ...を使用できます。これは、逆の操作(ゲームカードからメニューカードへの切り替え)を行います。

私はあなたのコードを調べていましたが、私はあきらめました(確かに、@ orzechowskidはあなたが調整する必要があるものをすでに指摘しているので)。このサイトにさらにコードを投稿する場合のヒント:

  1. SSCCE.org Webサイトを読み、そこに記載されているようにコードを投稿してみてください
  2. Javaの命名規則に従います(たとえば、クラスは大文字で始まり、変数は小文字で始まります)
  3. 独自のクラスに標準のJDKクラスと同じ名前を付けないでください。あなたのコードに精通していない(しかしおそらくJDKクラスに精通している)誰かがコードを読むのを非常に難しくします。panelimage.Imageたとえば、クラスとは関係のない独自のクラスがあるjava.awt.Imageことに気付くまで、少し時間がかかりました。

そして、私があなたのコードについて見たものに基づいて、Swingに関連するいくつかのヒントを示します。

  1. LayoutManagerの使用方法とnullレイアウトの削除方法を学びます。レイアウトマネージャーへのビジュアルガイドは良い出発点かもしれません
  2. Swingは、KeyListenersではなくKeyBindingsで動作するように設計されています。チュートリアルを見る
  3. SwingUIと組み合わせThread.sleepて複数のを使用および実行する場合は注意が必要です。SwingのスレッドルールThreadを知っていることを確認してください
于 2012-05-08T19:47:56.467 に答える
1

SwingUtilities.invokeLater()ボタンのアクションリスナー内で呼び出すと、2番目のProject0オブジェクトが作成されます。また、を作成するたびProject0に、メインメニューが内部にあるJFrameが画面に描画されます。の呼び出しを削除するSwingUtilities.invokeLater()と、1つのフレームが残ります。

于 2012-05-08T19:39:26.073 に答える