1
package gameprojekt;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.WindowConstants;

//The GameWindow class holds the window
public class Game extends JFrame {

    /*Global variable declaration*/
    private int width;
    private int height;
    private int windowXPos;
    private int windowYPos;

    public static String p1 = "Player1";
    public static String p2 = "Player2";

    public static int playerScore = 0;
    public static int oponentScore = 0;

    public static int player1X;
    public static int Player1Y;
    public static int player2X;
    public static int Player2Y;

    private static boolean running = true;

    public static int status = 0;
    public static JFrame frame = new JFrame("Pong"); 
    //public TestDrawPanel testPanel = new TestDrawPanel();

    public static int getStatus() {
        return status;
    }

    public static void setStatus(int status) {
        Game.status = status;
    }

    // ------------------------------------------------------------

    /**
     * Creates a new JFrame window with the given size and
     * center it based on the screen resolution
     */
    public static final long serialVersionUID = 1L;

      public Game() {
        /*Local variable declaration*/
        //JFrame frame = new JFrame("Pong");
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();

        width = (int)dim.getWidth();
        height = (int)dim.getHeight();

        windowXPos = width / 2 - (width / 2) / 2;
        windowYPos = height / 2 - (height / 2) / 2;
        // ------------------------------------------------------------

        // Set size, half of the screen resolution
        frame.setSize(width/2, height/2);
        // Allign the window to the users resolution
        frame.setLocation(windowXPos, windowYPos);
        frame.setVisible(true);
        frame.setResizable(false);
        // By exiting the window using "X" all relevant data is closed
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }


    /* zum Testen auskommentiert
    @Override
    public void paint(Graphics g) {
        System.out.println("test");
        this.drawPlayer(g);
    }*/

    /**
     * Draw the Player on the given location and with the given size
     * @param g Graphics object
     */
    public void drawPlayer(Graphics g) {

    }

    private static void gameLoop() {
        Menue m = new Menue();
        m.loadMenue(frame);

        while (running) {
            if (m.isStartPressed()) {
                System.out.println("test");
            }

        }
    }

    /**
    * Create the game and initialize the gameplay
    */
    public static void main(String[] args) {
        /*Variable declaration*/

        // ------------------------------------------------------------
        Game game = new Game();
        game.gameLoop();
    }
}

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gameprojekt;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 *
 * 
 */
public class Menue {

    /* Global variable declaration */
    private int widthMenue;
    private int heightMenue;
    private String start = "Start";
    private String highscores = "Highscores";
    private boolean startPressed = false;
    public JButton bStart = new JButton(start);
    public JButton bScore = new JButton(highscores);
    // ----------------------------------------------------

    public boolean isStartPressed() {
        return startPressed;
    }

    public void setStartPressed(boolean startPressed) {
        this.startPressed = startPressed;
    }

    public int getWidthMenue() {
        return widthMenue;
    }

    public void setwidthMenue(int widthMenue) {
        this.widthMenue = widthMenue;
    }

    public int getheightMenue() {
        return heightMenue;
    }

    public void setheightMenue(int heightMenue) {
        this.heightMenue = heightMenue;
    }

    public void loadMenue(JFrame j) {
        JPanel menue = new JPanel();

        LayoutManager border = new BorderLayout();
        menue.setLayout(border);
        menue.setBackground(Color.black);

        bStart.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                setStartPressed(true);
            }
        });

        menue.add(bStart, BorderLayout.LINE_START);
        menue.add(bScore, BorderLayout.LINE_END);

        j.getContentPane().add(menue);
    }
}

こんにちは、変数startPressedが無視されているように見えるという問題があります。開始ボタンが押された場合、変数startPressedは true に設定されますが、この while ループの if ステートメントは新しい値に反応しません。

        while (running) {
            if (m.isStartPressed()) {
                System.out.println("test");
            }

        }

System.out.printlnループ内またはループ内に追加するThread.sleepと、if ステートメントが値を認識し、出力が得られます。

プログラミング構造に主な問題があるか、Java が遅すぎるのではないかと考えました。何か案は?ありがとう!

4

2 に答える 2

1

あなたの主な問題は、あなたの startPressed 変数が揮発性にされていないため、あるスレッドで変更しても別のスレッドに反映されない可能性があることです。これを変更すると、スタート ボタンがこの変数を適切に変更することがわかります。

private volatile boolean startPressed = false;

ゲーム ループは、Swing のスレッド化ルールに反するようなものであってはなりません。Swing Timer を使用しない理由 (私の好み) や、独自のループが必要な場合は、バックグラウンド スレッドで実行します。また、startPressed を「バインドされた」変数にすることも検討してください。これは、変更されたときに、状態が変更されたことをプロパティ変更リスナーに通知します。これは、その値を常にポーリングするよりも優れています。

別のコメント: あなたのコードは statics を過剰に使用しており、ほとんどの static 修飾子を取り除くと、よりよく整理されます。

于 2013-03-22T22:21:21.613 に答える
0

あなたが次のようなことをするとき

while(running) {
    ...
}

つまり、このループは何度も何度も実行され、停止するものはなく、PCが実行できる速度で実行されます。したがって、それは他のすべてをブロックする傾向があります。そうです、あなたのプログラム構造が問題です。別のスレッドでゲームループを実行してみてください。このスレッドは、ビューを随時更新できます。たぶん、このスレッドを時々一時停止するか、何らかの方法でスケジュールすることを考えてください。そうすれば、ビューは毎秒(または必要なもの)だけ更新されます。

于 2013-03-22T22:28:50.643 に答える