libro
www.tuyano.com
初心者のためのJava SEプログラミング入門

スレッドとアニメーション (8/9)

作成:2010-01-14 21:15
更新:2014-09-04 07:56

■イメージを合成してアニメーションする

では、サンプルを作ってみましょう。ここでは背景に「haikei.gif」(横250×縦150)、その上に重ねて表示するイメージに「chara.gif」(横縦共に50)というイメージファイルをクラスファイルと同じ場所に用意し、これを読み込んで動かすことにします。

下のソースコードがサンプルです。だいたいこんな感じになりました。先の例と同様、「GO」した後に「change」すれば動く方向がランダムに設定されます。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

import java.awt.*;
import java.awt.event.*;
        
public class Test12 extends Frame implements ActionListener,Runnable {
    MyCanvas c1;
    Button b1,b2;
    Image offImg,img1,img2;
    Thread t1;
    int lastX,lastY,moveX,moveY;
    boolean KissOfDeath;
        
    public Test12() {
        super();
        setTitle("Hello");
        setSize(300,250);
        setLayout(null);
        
        lastX = 0;
        lastY = 0;
        KissOfDeath = false;
        Toolkit tk = Toolkit.getDefaultToolkit();
        img1 = tk.getImage("haikei.gif");
        img2 = tk.getImage("chara.gif");
        
        c1 = new MyCanvas();
        c1.setBounds(25,25,250,150);
        this.add(c1);
        
        b1 = new Button("GO");
        b1.setBounds(25,200,100,25);
        b1.addActionListener(this);
        this.add(b1);
        
        b2 = new Button("change");
        b2.setBounds(175,200,100,25);
        b2.addActionListener(this);
        this.add(b2);
    }
        
     public static void main (String args []) {
        new Test12().setVisible(true);
    }
        
    public void actionPerformed(ActionEvent ev) {
        if (ev.getSource() == b1) {
            if (img1!= null && img2 != null && offImg != null){
                KissOfDeath = ! KissOfDeath;
                if (KissOfDeath){
                    t1 = new Thread(this);
                    t1.start();
                }
            }
        }
        if (ev.getSource() == b2) {
            moveX = (int)(Math.random() * 21 - 11);
            moveY = (int)(Math.random() * 21 - 11);
        }
    }
        
    public void run(){
        Graphics g = offImg.getGraphics();
        try {
            while(KissOfDeath){
                if (lastX + moveX < 0 || (lastX + moveX) > (c1.getWidth() - 50)){
                    moveX *= -1;
                }
                if (lastY + moveY < 0 || (lastY + moveY) > (c1.getHeight() - 50)){
                    moveY *= -1;
                }
                lastX += moveX;
                lastY += moveY;
                g.drawImage(img1,0,0,this);
                g.drawImage(img2,lastX,lastY,this);
                c1.repaint();
                t1.sleep(100);
            }
        } catch(Exception e){
            System.out.println(e);
        }
        g.dispose();
    }
        
    class MyCanvas extends Canvas{
        
        public void update(Graphics g){
            paint(g);
        }
        
        public void paint(Graphics g){
            if (offImg == null){
                offImg = createImage(250,150);
            }
            g.drawImage(offImg,0,0,this);
        }
    }
}

※関連コンテンツ

「初心者のためのJava SEプログラミング入門」に戻る