2

BlueJ で単純なゲームを開発しています。「スペース インベーダー」のようなものです。私の問題は、 の付いた UFO のようにオブジェクトを動かしてもKeyListener、古い UFO が消えないことです!

フレームを更新するには、次のようにします。

public static void updateJframe()
{
  SwingUtilities.updateComponentTreeUI(canvas);
}

canvasCanvasを拡張するクラスの変数ですJFrame

さらにコードが必要な場合は、問題なく投稿できます。

コメントにコードを投稿して申し訳ありません。私も初心者です:$

public class Inout 
{

    private static Canvas canvas;
    private Motor motor;

    public Inout()
    {
        motor = new Motor(); //in class "Motor" is the logic of the game
       canvas = new Canvas();
    }

    public static void actualizar() //this is the method where i'm trying to update the                     frame
    {
        canvas.removeAll();
        SwingUtilities.updateComponentTreeUI(canvas);
    }

    public class Canvas extends JFrame implements KeyListener 
    {


        public Canvas ()
        {
            addKeyListener(this);
            setFocusable(true);
            setFocusTraversalKeysEnabled(false);
            setTitle("Space Invaders");
            setSize(1200,600);
            setVisible(true);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
        }

        public void paint(Graphics g)
        {
            int i = 0;
            int j = 0;
            for (i = 0; i < 30 ; i++)
            {
                for (j = 0; j < 50; j++)
                {
                    if (Motor.cuadricula[i][j].esUfo())    
                    {
                        g.setColor (Color.blue);
                        g.fillRect(i*40,j*20,20,15);   
                    }
                    else if (Motor.cuadricula[i][j].esDef())    
                    {
                        g.setColor (Color.red);
                        g.fillRect(i*40,j*20,20,15);}
                    }
                }
            }
        }   
        public void keyPressed(KeyEvent e)
        {}

        public void keyReleased(KeyEvent e)
        {
            int keyCode = e.getKeyCode();
            if(keyCode == KeyEvent.VK_P){
                Motor.moverDef(1);//mover una casilla a la derecha

            }
            else if(keyCode == KeyEvent.VK_O){
                Motor.moverDef(0);//mover una casilla a la izquierda
                Inout.actualizar();
            } 
        }

        public void keyTyped (KeyEvent e){}
    }
}

私が理解できないトピックは、「actualizar);」を使用する場合です。他のメソッドからのメソッドは問題なく動作しますが、KeyListener からのメソッドではバグが発生します。

助けてくれて本当にありがとうございます!!

4

1 に答える 1

1

良い方法:ペイントの代わりに paintComponent メソッドを使用すると、@ repaint で古いオブジェクトが消えないという問題が発生しなくなります。

悪い方法:ペイントが呼び出されるたびに背景を塗りつぶします (メソッドの開始時) - 以前にペイントしたすべてのものをカバーします。

于 2012-05-05T15:50:29.123 に答える