1

私は次のコードを持っています.私はひよこ配列の画像を少し遅れて画面に表示したい.新しい画像が読み込まれるとき、座標はx方向ごとに10pxずつシフトする必要があります.追加のコードを知りたいスニペットをこのコードに追加して、私が持っている2つの画像を使用してフレームにアニメーションを追加できます.以下は私のコードです:

 import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Frame;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.Toolkit;


    public class Chicken extends Frame implements Runnable{
        Thread animation;
        long frameDelay = 3000;
        Image chick[] = new Image[2];
        int numFrames = chick.length;
        Toolkit tk = getToolkit();
        public Chicken()
        {
            setSize(new Dimension(300,300));
            setVisible(true);
            setBackground(Color.BLACK);
            animation = new Thread(this);
            chick[0] = tk.createImage("stand.png");
            chick[1] = tk.createImage("walk.png");
            animation.start();
            //setVisible(false);

        }
        public void paint(Graphics g)
        {
            g.drawImage(chick[0],100,100,null );
        }
        @Override
        public void run() {
            // TODO Auto-generated method stub
            repaint();
            try {
                Thread.sleep(frameDelay);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
        public static void main(String args[])
        {
            Chicken instance = new Chicken();
        }

    }
4

1 に答える 1

1

したがって、最初の問題はリソースの問題です。

アプリケーション内に保存されたリソース (通常は埋め込みリソースと呼ばれます) は、外部リソースのように読み込むことができません。

chick[0] = tk.createImage("stand.png");

"./stand.png"存在しないファイルが必要です。Class#getResource代わりに、 APIを介してリソースをロードする必要があります...

chick[0] = tk.createImage(getClass().getResource("/stand.png"));

paint直面する 2 番目の問題は、最上位のコンテナーをオーバーライドしているという事実です。これは本当にすべきではありません。ダブルバッファリングされていないという事実から始めて、フレームには表示可能な領域内にある装飾があるという事実で終わりましょう。これは、装飾が表面にペイントしたものと重なることを意味します...きれいではありません...

3 番目の問題は、画像の移動先を伝えていないことです。静的です。

ペイントする場所をイメージに伝える何らかの x/y 値が必要です。呼び出す前に、スレッド内の特定の x/y デルタによってこれらの値を変更しますrepaint...

あなたが持つかもしれない4番目の問題は、AWTを使用しているという事実です...これは一種の時代遅れです。Swing は、二重バッファリングの問題を解決してくれます...私見ですが、より良い選択をするでしょう - Swing に関するドキュメントや例は、今ではもっとたくさんあります;)

私が馬に乗っている間...個人的には、orをお勧めImageIOします。これは主に、より多くの形式をサポートするためですが、何らかの理由で画像を読み取れない場合にスローされるためです...Toolkit#createImageImageIconException

Swingなら簡単な例がありますが、トピックの実行に問題が発生するので投稿しません...見たい場合はお知らせください

Swingの例で更新

これは、デフォルトのパッケージに埋め込まれた画像を使用しています...

ここに画像の説明を入力

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class ChickenDance {

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

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

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

    public class TestPane extends JPanel {

        private BufferedImage chicken;
        private int xPos;
        private int yPos;

        private int xDelta = 4;

        public TestPane() {
            try {
                chicken = ImageIO.read(getClass().getResource("/Chicken.png"));
            } catch (IOException ex) {
                Logger.getLogger(ChickenDance.class.getName()).log(Level.SEVERE, null, ex);
            }

            Timer timer = new Timer(40, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    xPos += xDelta;
                    if (xPos + chicken.getWidth() > getWidth()) {
                        xPos = getWidth() - chicken.getWidth();
                        xDelta *= -1;
                    } else if (xPos < 0) {
                        xPos = 0;
                        xDelta *= -1;
                    }
                    yPos = (getHeight() - chicken.getHeight()) / 2;
                    repaint();
                }
            });
            if (chicken != null) {
                timer.start();
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (chicken != null) {
                Graphics2D g2d = (Graphics2D) g.create();
                g2d.drawImage(chicken, xPos, yPos, this);
                g2d.dispose();
            }
        }
    }

}
于 2013-08-21T07:44:25.667 に答える