2

こんにちは、ポリゴンと awt をいじっています。Jframe を作成し、ポリゴンを正常に描画して、そのうちの 1 つをキー操作で移動させることができます。

jframeを個別に更新するゲームループスレッドを開始する方法(およびどこに置くか)を考えています。

グーグルから、ユーザー入力用に1つのスレッドとゲーム自体用に1つのスレッドが必要であると信じるようになりました。

現時点では、ボード クラス (以下に示すコード) に KeyListener を実装していますが、それを独自のクラスに配置して、実行可能に実装する必要がありますか?コードがそのままの状態で、keypressed() メソッドで JFrame を再描画します。正しく動くことを確認する

一日のほとんどを過ごしていて、私は非常に混乱しています:)いつものように、どんな助けも大歓迎です!

また、オンライン チュートリアルから取得している間は、JFrame の代わりに JPanel を使用し、paint() の代わりに paintComponent() を使用する必要がありますか?

    import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.AffineTransform;

import javax.swing.JFrame;

public class Board extends JFrame implements KeyListener{
    AffineTransform identity = new AffineTransform();
    Graphics2D g2d;

    Ship ship = new Ship();

    public static final int ALIENS = 3;
    Alien[] alien = new Alien[ALIENS];


    Board(){
        super("The Board");
        setSize(1280,1024);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setBackground(Color.BLACK);
        for(int x=0;x<ALIENS;x++){
            alien[x]=new Alien();
        }
    }

    public void paint(Graphics g){
        super.paint(g);
        addKeyListener(this);
        //draw ship
        g2d = (Graphics2D)g;    
        g2d.setTransform(identity);
        g2d.translate(ship.getxPos(),ship.getyPos());
        g2d.scale(2,2);
        g2d.setColor(Color.ORANGE);
        g2d.fill(ship.getShape());
        g2d.setColor(Color.BLACK);
        g2d.draw(ship.getShape());

        // draw aliens
        for(int x=0;x<ALIENS;x++){
            //if alien alive
            if(alien[x].isAlive()){
                //draw alien
                g2d = (Graphics2D)g;    
                g2d.setTransform(identity);
                g2d.translate(alien[x].getxPos(),alien[x].getyPos());
                g2d.scale(2,2);
                g2d.setColor(Color.BLUE);
                g2d.fill(alien[x].getShape());
                g2d.setColor(Color.BLACK);
                g2d.draw(alien[x].getShape());
            }
        }
    }//end paint


    /*****************************************************
     * key listener events
     *****************************************************/
    public void keyReleased(KeyEvent k) { }
    public void keyTyped(KeyEvent k) { }
    public void keyPressed(KeyEvent k) {
        int keyCode = k.getKeyCode();

        switch (keyCode) {

        case KeyEvent.VK_A:
            //move ship left
            if(ship.getxPos()<20){
                ship.setxPos(20);
            }else
            ship.setxPos(ship.getxPos()-1);
            break;
        case KeyEvent.VK_D:
            if(ship.getxPos()>1260){
                ship.setxPos(1260);
            }else
            ship.setxPos(ship.getxPos()+1);
        }
       repaint();
    }//end keypressed event

    public static void main(String[] args){
        new Board();
    }
}
4

1 に答える 1

4

これらの答えは、作成しようとしているゲームの種類によって多少異なります。

グーグルから、ユーザー入力用に 1 つのスレッドと、ゲーム自体用に 1 つのスレッドが必要であると信じるようになりました。

独自のスレッドで実行される 1 つのメイン ゲーム ループを作成します。疑似コードで

while (running) {
    update game model
    draw game
    wait x milliseconds
} 

ユーザー入力は、ゲーム モデルを直接更新します。ゲームループは、コンピューターが動きをしたり、あなたの動きに反応したりする必要がある場合、ゲームモデルを更新します。次に、ゲーム ループがゲーム モデルを読み取り、モデルの値に基づいてゲームを描画します。

現時点では、ボード クラス (以下に示すコード) に KeyListener を実装していますが、それを独自のクラスに入れて、実行可能に実装する必要がありますか?

はい、KeyListener を独自のクラスに配置する必要があります。いいえ、別スレッドにする必要はありません。

将来のトラブルを避けるために、Swing コンポーネントを定義し、Event Dispatch スレッドで使用する必要があります。

その方法は次のとおりです。

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new Board();
        }
    });
}

JFrame の代わりに JPanel を使用し、paint() の代わりに paintComponent() を使用する必要がありますか?

はい。

JFrame 内に JPanel が必要です。JPanel は、paintComponent メソッドを使用してドロー ゲームの疑似コードを実行する場所です。

私に同意しない人もいますが、ゲーム内のすべてのオブジェクトに自分自身を描画する draw メソッドがあれば、それが最善であることがわかりました。

public void draw(Graphics g)

ゲーム モデルには、モデル内のすべてのオブジェクトを描画する draw メソッドも含まれます。

JPanel の paintComponent メソッドは次のようになります。

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    gameModel.draw(g);
}
于 2013-02-27T19:24:06.037 に答える