6

ボートをx軸上で動かそうとしています(まだキーボードはありません)。boat.png動き/アニメーションを他の画像ではなく、に関連付けるにはどうすればよいですか?

public class Mama extends Applet implements Runnable {

    int width, height;
    int x = 200;
    int y = 200;
    int dx = 1;
    Image img1, img2, img3, img4;

    @Override
    public void init(){
        setSize(627, 373);
        Thread t = new Thread(this);
        img1 = getImage(getCodeBase(),"Background.png");
        img2 = getImage(getCodeBase(), "boat.png");
        img3 = getImage(getCodeBase(), "LeftPalm.png");
        img4 = getImage(getCodeBase(), "RightPalm.png");

    }

    @Override
    public void paint(Graphics g){
        g.drawImage(img1, 0, 0, this);
        g.drawImage(img2, 200, 200, this);
        g.drawImage(img3, 40, 100, this);
        g.drawImage(img4, 450, 130, this);
    }

    @Override
    public void run() {
        while(true){

            x += dx;
            repaint();
            try {
                Thread.sleep(17);
            } catch (InterruptedException e) {
                System.out.println("Thread generates an error.");
            }
        }
    }
} 
4

2 に答える 2

11

目立つものがいくつかあります...

問題"

すでに述べたように、画像描画プロセスに可変引数を指定する必要があります。 g.drawImage(img2, x, y, this);、これにより、画像をペイントする場所を定義できます。

を実装Runnableしている間、実際にはそれを呼び出すスレッドを開始していません。これは、実際には何も変数を変更していないことを意味します。

あなたstartのメソッドでは、のようなものを呼び出す必要がありますnew Thread(this).start()

推奨事項

質問にSwingのタグを付けましたが、AWTコンポーネントを使用しています。これはお勧めしません(実際、アプレットは面倒なのでお勧めできません-私見)。もう1つの問題は、すぐにわかるように、ダブルバッファリングされていないことです。これは、通常、アニメーションの実行時にちらつきを引き起こしますが、これは望ましくありません。

paint補足として、のようなトップレベルのコンテナのメソッドをオーバーライドすることもお勧めしませんApplet。トップレベルのコンテナには多くの追加コンポーネントが含まれている傾向がありpaintます。このようなメソッドをオーバーライドすると、この設定が破棄されます。また、トップレベルのコンテナもダブルバッファリングされる傾向はありません。

以下の例では、を使用してJFrameいますが、を使用するように変換するのにそれほど時間はかかりませんJApplet(これをドロップするだけAnimationPanelです。これが、トップレベルのコンテナからの拡張が一般的に推奨されないもう1つの理由です;)

ここに画像の説明を入力してください

public class AnimatedBoat {

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

    public AnimatedBoat() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new AnimationPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class AnimationPane extends JPanel {

        private BufferedImage boat;
        private int xPos = 0;
        private int direction = 1;

        public AnimationPane() {
            try {
                boat = ImageIO.read(new File("boat.png"));
                Timer timer = new Timer(40, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        xPos += direction;
                        if (xPos + boat.getWidth() > getWidth()) {
                            xPos = getWidth() - boat.getWidth();
                            direction *= -1;
                        } else if (xPos < 0) {
                            xPos = 0;
                            direction *= -1;
                        }
                        repaint();
                    }

                });
                timer.setRepeats(true);
                timer.setCoalesce(true);
                timer.start();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return boat == null ? super.getPreferredSize() : new Dimension(boat.getWidth() * 4, boat.getHeight());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            int y = getHeight() - boat.getHeight();
            g.drawImage(boat, xPos, y, this);

        }

    }

}
于 2013-01-21T10:09:01.437 に答える
3

に置き換える必要がありg.drawImage(img2, 200, 200, this);ますg.drawImage(img2, x, y, this);

于 2013-01-21T07:27:06.783 に答える