0

シンプルな 2D ゲーム エンジンを使って最初のゲームを作成する作業をしていました。とにかく、 if (input.KEY_RIGHT) x++; を追加するたびに、キャンバスが読み込まれません。JPanel の背景のみを表示します。しかし、if (input.KEY_RIGHT) x++; を削除すると、機能します。うまくいかない理由を教えてください。

package net.james222.game;

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;


/**
 * Main class for the game
 */
public class Game extends JFrame
{       

public InputHandler input;

private static final long serialVersionUID = 1L;
    boolean isRunning = true;
    int fps = 30;
    int windowWidth = 500;
    int windowHeight = 500;

    BufferedImage backBuffer;
    Insets insets;

    int x = 0;

    public static void main(String[] args)
    {
            Game game = new Game();
            game.run();
            System.exit(0);
    }

    /**
     * This method starts the game and runs it in a loop
     */
    public void run()
    {
            initialize();

            while(isRunning)
            {
                    long time = System.currentTimeMillis();

                    update();
                    draw();

                    //  delay for each frame  -   time it took for one frame
                    time = (1000 / fps) - (System.currentTimeMillis() - time);

                    if (time > 0)
                    {
                            try
                            {
                                    Thread.sleep(time);
                            }
                            catch(Exception e){}
                    }
            }

            setVisible(false);
    }

    /**
     * This method will set up everything need for the game to run
     */
    void initialize()
    {
            setTitle("Game Tutorial");
            setSize(windowWidth, windowHeight);
            setResizable(false);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setVisible(true);

            insets = getInsets();
            setSize(insets.left + windowWidth + insets.right,
                            insets.top + windowHeight + insets.bottom);

            backBuffer = new BufferedImage(windowWidth, windowHeight, BufferedImage.TYPE_INT_RGB);
            }

    /**
     * This method will check for input, move things
     * around and check for win conditions, etc
     */
    void update()
    {
       if(input.KEY_RIGHT) x++;
    }

    /**
     * This method will draw everything
     */
    void draw()
    {              
            Graphics g = getGraphics();

            Graphics bbg = backBuffer.getGraphics();

            bbg.setColor(Color.WHITE);
            bbg.fillRect(0, 0, windowWidth, windowHeight);

            bbg.setColor(Color.BLACK);
            bbg.drawOval(x, 10, 20, 20);

            g.drawImage(backBuffer, insets.left, insets.top, this);
    }
} 
4

1 に答える 1

2

ペイントは通常、SwingpaintComponentから拡張されたコンポーネントのメソッドで行われますJComponent(通常はJPanel)

は絶対に使用しないでくださいgetGraphics。これは、最後のペイント サイクル後のコンポーネントの状態の単なるスナップ ショットであり、nullコンポーネントがまだペイントを開始していない場合に戻る可能性があります。その内容は、次のペイント サイクルでもオーバーライドされます。

見てみるところから始めます

また、キー バインディングAPIを使用することをお勧めしますKeyListener(実際に入力イベント ハンドラーを使用しているのを目にすることはできません)...

また、Swingのシングル スレッド モデルに違反しているため、Swingと初期スレッドの同時実行を確認することをお勧めします。

Java/Swing は複雑な API/フレームワークであり、その使用には非常に特殊な要件があります。非常に柔軟ですが、それを最大限に活用するには、その仕組みを理解する必要があります。

これらの概念を理解するまでの間、ゲームへの願望は脇に置いておきます。これにより、あなたの人生は何百万倍もシンプルになります。

于 2013-08-03T01:53:57.430 に答える