0

Swing のペイント技術 paintComponent() メソッドを使用してゲームを書き直すことにしました (SO の誰かが実際にこのメソッドを使用するように言いました)。Canvas の代わりに JPanel をゲームのベースとして使用することにしました。以前に作成したゲームは Canvas を使用していますが、64 ビットのデスクトップではゲームが表示されませんでしたが、32 ビットのラボトップでは表示される可能性があったため、このゲームを書き直す必要がありました。

問題は、船の動きが機能している間、描画が非常に遅いように見えることです(ラップトップの問題でない限り)、以前にAWTのダブルバッファリング描画技術を使用していたものと比較して. 私は丸一日を費やしましたが、何が船をより速く走らせることができるのかを理解できませんでした.

   public class Ship extends JLabel implements KeyListener{

        private Image image;
        private boolean turnRight;
        private int x;
        private int y;
        private int speed = 5;
        private boolean turnLeft;

        public Ship(int x, int y)
        {
            this.x = x;
            this.y = y;

            try {
                image = ImageIO.read(new File("Ship/Ship.PNG"));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            addKeyListener(this);

        }

        public Image getImage()
        {
            return image;
        }

        @Override
        public void keyPressed(KeyEvent e) {
            // TODO Auto-generated method stub

            if(e.getKeyCode() == KeyEvent.VK_RIGHT)
            {

                x += speed;
                setTurnRight(true);
                setTurnLeft(false);

            }
            else if(e.getKeyCode() == KeyEvent.VK_LEFT)
            {

                x -= speed;
                setTurnLeft(true);
                setTurnRight(false);
            }


            // redraw yourself
            repaint();

        }

        private void setTurnLeft(boolean turnLeft) {
            // TODO Auto-generated method stub
            this.turnLeft = turnLeft;
        }

        // swing custom painting 
        public void paintComponent(Graphics g)
        {
            if(x <= 0)
            {
                x = 0;

            }
            else if(x >= 610)
            {
                x = 610;
            }

            g.drawImage(getImage(), x, y, null);

        }

        public void setTurnRight(boolean turnRight)
        {
            this.turnRight = turnRight;
        }

        public boolean getTurnLeft()
        {
            return turnLeft;
        }

        public boolean getTurnRight()
        {
            return turnRight;
        }

        @Override
        public void keyReleased(KeyEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void keyTyped(KeyEvent e) {
            // TODO Auto-generated method stub

        }

    }
4

2 に答える 2

0

JPanel を拡張し、そこに javax.swing.Timer を使用して 1000/fps と ActionListener を定義するクラスを用意することをお勧めします。これは現在、paintComponent と呼ばれています。

その説明はひどかったので、ここにいくつかのコードがあります:

public class Class_Name extends JPanel()
{
    Ship ship = new Ship(0,0);
    javax.swing.Timer timer = new javax.swing.Timer(1000/60, new ActionListener(){
        repaint();
    });

    public void paintComponent(Graphics g)
    {
        super.paintComponent();
        ship.draw(g);
    }
}

and the draw is, what is now called paintComponent.

これで質問の答えが得られなかった場合は、お知らせください。

于 2013-05-31T23:23:29.270 に答える