タイマで画像を切り替えてアニメーション

タイマ割り込みで5枚の画像を切り替えて犬が歩くアニメーションを描画します。

前田稔の超初心者のプログラム入門

プログラムの作成

  1. メモ帳などでタイプして Dog.java の名前で保存して下さい。
    //★ Timer で5枚の画像を切り替えてアニメーション    前田 稔
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    
    class Dog extends JFrame implements ActionListener
    {   Image   img[];
        Timer   time;
        int     currFrame;
    
        // Main
        public static void main(String args[])
        {   new Dog();
        }
    
        // Constructor
        public Dog()
        {   super("Dog Animation");
            img = new Image[5];
            img[0]= getToolkit().getImage("Dog0.gif");
            img[1]= getToolkit().getImage("Dog1.gif");
            img[2]= getToolkit().getImage("Dog2.gif");
            img[3]= getToolkit().getImage("Dog3.gif");
            img[4]= getToolkit().getImage("Dog4.gif");
    
            currFrame = 0;
            time = new Timer(100, this);
            time.start();
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(200, 150);
            setVisible(true);
        }
    
        public void paint(Graphics g)
        {   if (img[currFrame]!=null)
            {   g.drawImage(img[currFrame],30,50,this);
            }
        }
        
        public void actionPerformed(ActionEvent evt)
        {   Object source = evt.getSource();
            if (source == time)
            {   if (isShowing())
                {   currFrame = currFrame % 5;
                    repaint();
                }
            }
        }
    }
    
  2. 画像ファイル(dog0.gif〜dog4.gif)をプログラムと同じフォルダーに格納して下さい。
  3. ソースプログラムをコンパイルして class オブジェクトを実行して下さい。
    Windows の画面に犬の画像が表示されてアニメーションされていたら完成です。
    画像の読み込みに多少時間がかかるので、起動直後はフレーム枠だけが表示されることがあります。
    確認が終わればアニメーションウインドウの「×」をクリックして下さい。
    DOS 画面にメッセージが表示されてプログラムが終了します。

プログラムの説明

タイマ割り込みで dog0.gif〜dog4.gif の5枚の画像を切り替えて犬が歩くアニメーションを描画します。
  1. Swing(スィング)を使ったプログラムの基本的な説明は Swing を使って、色を設定して線を描く を参照して下さい。
    java.awt.event.* をインポートして ActionListener を implements して下さい。
    Image img[] は5枚分のイメージの Object です。
    time はタイマの Object です。
    currFrame はタイマ切り替えで表示する画像の番号です。
        import java.awt.*;
        import javax.swing.*;
        import java.awt.event.*;
    
        class Dog extends JFrame implements ActionListener
        {   Image   img[];
            Timer   time;
            int     currFrame;
        
  2. Dog の Constructor です。
    Image[5] でインスタンス化して getImage() で画像を入力します。
    currFrame は表示する画像の番号で、最初は0番目に設定します。
    new Timer(100, this) でタイマをインスタンス化します。
    タイマ間隔(切替速度)は、100ミリ秒に設定しています。
    time.start() でタイマを開始します。
        // Constructor
        public Dog()
        {   super("Dog Animation");
            img = new Image[5];
            img[0]= getToolkit().getImage("Dog0.gif");
            img[1]= getToolkit().getImage("Dog1.gif");
            img[2]= getToolkit().getImage("Dog2.gif");
            img[3]= getToolkit().getImage("Dog3.gif");
            img[4]= getToolkit().getImage("Dog4.gif");
    
            currFrame = 0;
            time = new Timer(100, this);
            time.start();
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(200, 150);
            setVisible(true);
        }
        
  3. 画像を表示するメソッドです。
    super.paint(g) を呼び出すと、画面が初期化(クリア)されます。
    今回のプログラムでは、初期化に時間がかかるのと、クリア画面を挟むと余計に画面が「チラツキ」ます。
    前回の画面の上から重ね書きしてもかまわないときは、super.paint(g) を呼び出す必要はありません。
    img[] に画像が設定されていることを確かめて、drawImage() で画像を表示します。
    30,50 は画像を表示する座標です。
        public void paint(Graphics g)
        {   //super.paint(g);
            if (img[currFrame]!=null)
            {   g.drawImage(img[currFrame],30,50,this);
            }
        }
        
  4. タイマ割り込みのメソッドです。
    割り込みが自分に対するものかを if(source == time) で確かめます。
    isShowing() で画面が表示中かを確かめます。
    (currFrame+1) % 5; で表示する画像を切り替えて repaint() で画像を表示するメソッドを呼びます。
        public void actionPerformed(ActionEvent evt)
        {   Object source = evt.getSource();
            if (source == time)
            {   if (isShowing())
                {   currFrame = currFrame % 5;
                    repaint();
                }
            }
        }
        

超初心者のプログラム入門(Java2)