画像を用いたアニメーション

 

サーバーにアップロードした際には、画像ファイルのファイル名は大文字と小文字を区別される。
ローカルでは区別しないので、appletviewer では正常に実行できるが、サーバーにアップロードした時に画像が読み込まれない症状が出る。
この時、エラーは表示されないので注意!!


【例】画像を10枚(0.PNG 〜 9.PNG)を用いたアニメーションを表示する。
import java.applet.*;
import java.awt.*;
import java.net.*;
public class animation3 extends Applet implements Runnable {
    int FRAMES = 10;//画像の枚数
    Image img1[] = new Image[FRAMES];
    String fname1[] = 
      {"0.PNG","1.PNG","2.PNG","3.PNG","4.PNG","5.PNG","6.PNG","7.PNG","8.PNG","9.PNG"};
    MediaTracker tracker = new MediaTracker(this);
    String message="";
    int num = 0;
    int speed=200;//アニメーションのスピードを設定
    private Thread thre = new Thread(this);
        
    public void start() {
        thre.start();
    }

    public void run() {
        int i = 0;
        for (num=0 ; num <= FRAMES-1 ; ++num ) { //画像を読み込む
            img1[num] = getImage(getDocumentBase(),fname1[num]); 
            tracker.addImage(img1[num],0);
            try { 
                tracker.waitForID(0); 
            } catch( InterruptedException e ){ }
        }
        for ( i=0 ; i <= 30 ; ++i ) { //画像を表示する
            num = i % FRAMES; // i を FRAMES で割った余りをnumに代入
            try { 
                Thread.sleep(speed); 
            } catch( InterruptedException e ){ }
            message = "実行中";
            repaint();
        }
        message = "終わりました";
        repaint();
    }
                         
    public void paint(Graphics g){
        g.drawString(message,10,190);
        if ( num <= FRAMES-1 ) {
            g.drawImage(img1[num],30,60,this);
        }

    }
}



実行例


【例】画像を10枚(0.PNG 〜 9.PNG)を用いたアニメーションを表示し、終了ボタンを押すまで繰り返し実行する。
import java.applet.*;
import java.awt.*;
import java.net.*;
import java.awt.event.*;
import java.awt.Button;
public class animation3_1 extends Applet implements Runnable, ActionListener {
    int FRAMES = 10;//画像の枚数
    Image img1[] = new Image[10];
    String fname1[] =
      {"0.PNG","1.PNG","2.PNG","3.PNG","4.PNG","5.PNG","6.PNG","7.PNG","8.PNG","9.PNG"};
    MediaTracker tracker = new MediaTracker(this);
    String message="";
    int num = 0;
    int speed=200;//アニメーションのスピードを設定
    int jikkou = 1; // 1:実行  0:終了
    private Thread thre = new Thread(this);
    private Button b = new Button("終了");    // ボタンを定義する
        
    public void init() {
        add(b);
        b.addActionListener(this);
    }
        
    public void start() {
        thre.start();
    }

    public void run() {
        int i = 0;
        for (num=0 ; num <= FRAMES-1 ; ++num ) { //画像を読み込む
            img1[num] = getImage(getDocumentBase(),fname1[num]); 
            tracker.addImage(img1[num],0);
            try { 
                tracker.waitForID(0); 
            } catch( InterruptedException e ){ }
        }
        while( jikkou == 1 ){//アニメーションを実行
            i = i + 1;
            num = i % FRAMES;
            try { 
                Thread.sleep(speed); 
            } catch( InterruptedException e ){ }
                message = "実行中";
                repaint();
        }
        message = "終わりました";
        repaint();
    }
    
    public void actionPerformed(ActionEvent e) {
        jikkou = 0;
        repaint();
    }

                         
    public void paint(Graphics g){
        g.drawString(message,10,190);
        if ( num <= FRAMES-1 ) {
            g.drawImage(img1[num],30,60,this);
        }

    }
}


実行例


【例】画像を10枚(0.PNG 〜 9.PNG)を用いたアニメーションを表示し、「もう一度」ボタンと「終了」ボタンを作る。
import java.applet.*;
import java.awt.*;
import java.net.*;
import java.awt.event.*;
import java.awt.Button;

public class animation3_5 extends Applet implements Runnable, ActionListener  {
    int FRAMES = 10;//画像の枚数
    Image img1[] = new Image[FRAMES];
    String fname1[] =
      {"0.PNG","1.PNG","2.PNG","3.PNG","4.PNG","5.PNG","6.PNG","7.PNG","8.PNG","9.PNG"};
    MediaTracker tracker = new MediaTracker(this);
    String message="";
    int num = 0;
    int speed=200;//アニメーションのスピードを設定
    private Thread thre = new Thread(this);
    private Button b = new Button("もう一度");    // ボタンを定義する
    private Button b1 = new Button("終了");    // ボタンを定義する
    int reset = 1;  // 1の時最初から実行 0なら実行されない(アイドリング)
    int jikkou = 1; // 1の時実行 0なら終了

    public void init() {
        add(b);
        b.addActionListener(this);
        add(b1);
        b1.addActionListener(this);
    }

        public void start() {
        thre.start();
    }

    public void run() {
        int i = 0;
        for (num=0 ; num <= FRAMES-1 ; ++num ) { //画像を読み込む
            img1[num] = getImage(getDocumentBase(),fname1[num]); 
            tracker.addImage(img1[num],0);
            try { 
                tracker.waitForID(0); 
            } catch( InterruptedException e ){ }
        }
        
        while(jikkou == 1){
            if(reset == 1) {
                for ( i=1 ; i <= 10 ; ++i ) { //画像を表示する
                    num = i % FRAMES; // i を FRAMES で割った余りをnumに代入
                    try { 
                        Thread.sleep(speed); 
                    } catch( InterruptedException e ){ }
                    message = "実行中";
                    repaint();
                }//end of for
                reset = 0;
            }//end of if(reset ==
            else {
                num = 0;
                try { 
                    Thread.sleep(speed); 
                } catch( InterruptedException e ){ }
                message = "待機中";
                repaint();
            }//end of else
        }//end of while(jikkou ==
        
        message = "終わりました";
        repaint();
    }

    public void actionPerformed(ActionEvent e) {
        String c;
        c = e.getActionCommand();  // ボタンのラベルの文字を取得する
        if(c == "もう一度") {
            reset = 1;
            message = "リセットされました";
        }
        if(c == "終了") {
            jikkou = 0;
        }
        repaint();
    }
        
    public void paint(Graphics g){
        g.drawString(message,10,190);
        if ( num <= FRAMES-1 ) {
            g.drawImage(img1[num],30,60,this);
        }

    }
}


実行例


【例】画像を10枚ずつ2組(0.PNG 〜 9.PNG)、(r0.PNG 〜 r9.PNG)用いたアニメーションを表示する。
import java.applet.*;
import java.awt.*;
import java.net.*;
public class animation3_2 extends Applet implements Runnable {
    int FRAMES = 10;//画像の枚数
    Image img1[] = new Image[10];
    Image img2[] = new Image[10];
    String fname1[] = 
      {"0.PNG","1.PNG","2.PNG","3.PNG","4.PNG","5.PNG","6.PNG","7.PNG","8.PNG","9.PNG"};
    String fname2[] = 
      {"r0.PNG","r1.PNG","r2.PNG","r3.PNG","r4.PNG","r5.PNG","r6.PNG","r7.PNG","r8.PNG","r9.PNG"};
    MediaTracker tracker = new MediaTracker(this);
    String message="";
    int num = 0;
    int speed=200;//アニメーションのスピードを設定
    private Thread thre = new Thread(this);;
        
    public void start() {
        thre.start();
    }

    public void run() {
        int i = 0;
        for (num=0 ; num <= FRAMES-1 ; ++num ) { //画像を読み込む
            img1[num] = getImage(getDocumentBase(),fname1[num]); 
            tracker.addImage(img1[num],0);
            img2[num] = getImage(getDocumentBase(),fname2[num]); 
            tracker.addImage(img2[num],1);
            try { 
                tracker.waitForID(0); 
                tracker.waitForID(1); 
            } catch( InterruptedException e ){ }
        }
        for ( i=0 ; i <= 30 ; ++i ) { //画像を表示する
                num = i % FRAMES; // i を FRAMES で割った余りをnumに代入
            try { 
                Thread.sleep(speed); 
            } catch( InterruptedException e ){ }
            message = "実行中";
            repaint();
        }
        message = "終わりました";
        repaint();
    }
                         
    public void paint(Graphics g){
        g.drawString(message,10,190);
        if ( num <= FRAMES-1 ) {
            g.drawImage(img1[num],30,60,this);
            g.drawImage(img2[num],30,260,this);
        }

    }
}


実行例


【問題】
上の例にボタンを2つ追加(アニメ1、アニメ2)、ボタンで画像を選択するように変更しなさい。


実行例



【問題】
上の問題にボタンを1つ追加(終了ボタンを追加)し、終了ボタンを押すまで繰り返し実行するように変更しなさい。


実行例