920 likes | 1.05k Views
JAVA GUIプログラミング. 第4回 スレッドを使った 簡単なアニメーション. アニメーションの原理. 今日作るアニメーションはパラパラ漫画のようにします。. つまり、画面を少しずつ変えて表示していきます。. では早速、今日のサンプル①です. import javax.swing.*; import java.awt.*; public class ex6 extends JApplet implements Runnable { int x,y; Thread anime=null; public void init() {
E N D
JAVA GUIプログラミング 第4回 スレッドを使った 簡単なアニメーション
アニメーションの原理 今日作るアニメーションはパラパラ漫画のようにします。 つまり、画面を少しずつ変えて表示していきます。
では早速、今日のサンプル①です import javax.swing.*; import java.awt.*; public class ex6 extends JApplet implements Runnable { int x,y; Thread anime=null; public void init() { x=100;y=100; anime=new Thread(this); anime.start(); }
サンプル① public void paint(Graphics g) { g.setColor(Color.white); g.fillRect(0,0,500,500); g.setColor(Color.black); g.fillOval(x,y,100,100); }
サンプル① public void run() { while (anime!=null) { x+=5; repaint(); if (x>500) {x=0;} try { Thread.sleep(100); } catch (InterruptedException e) {}; } }
どうですか? 塗りつぶされた円が動いていますね。 ではなぜ円が動くのかを解説していきましょう。
解説① import部 import javax.swing.*; import java.awt.*; 今回はこの2つをimportします。
解説① 宣言部 public class ex6 extends JApplet implements Runnable { int x,y; Thread anime=null;
解説① 宣言部 public class ex6 extends JApplet implements Runnable { int x,y; Thread anime=null; スレッドを使うときには 必ずrunnableをインプリメントします。
解説① 宣言部 public class ex6 extends JApplet implements Runnable { int x,y; Thread anime=null; 整数型の変数x,yを宣言しておきます。
解説① 宣言部 public class ex6 extends JApplet implements Runnable { int x,y; Thread anime=null; animeという名のスレッドを定義します。 anime=nullというのは まだスレッドを使える状態にしないことを意味しています。
解説① init部 public void init() { x=100;y=100; anime=new Thread(this); anime.start(); }
解説① init部 public void init() { x=100;y=100; anime=new Thread(this); anime.start(); } xとyの初期値をともに100にしておきます。
解説① init部 public void init() { x=100;y=100; anime=new Thread(this); anime.start(); } スレッドであるanimeを使える状況にします。
解説① init部 public void init() { x=100;y=100; anime=new Thread(this); anime.start(); } スレッドであるanimeを開始します。 これによって、public void run・・ の部分が実行されます。
解説① paint部 public void paint(Graphics g) { g.setColor(Color.white); g.fillRect(0,0,500,500); g.setColor(Color.black); g.fillOval(x,y,100,100); }
解説① paint部 public void paint(Graphics g) { g.setColor(Color.white); g.fillRect(0,0,500,500); g.setColor(Color.black); g.fillOval(x,y,100,100); } 色を白に設定し、 画面を白く塗りつぶします。
解説① paint部 public void paint(Graphics g) { g.setColor(Color.white); g.fillRect(0,0,500,500); g.setColor(Color.black); g.fillOval(x,y,100,100); } 色を黒に設定して 塗りつぶした円を描きます
解説① run部 public void run() { while (anime!=null) { x+=5; repaint(); if (x>500) {x=0;} try { Thread.sleep(100); } catch (InterruptedException e) {}; } }
解説① run部 public void run() { while (anime!=null) { x+=5; repaint(); if (x>500) {x=0;} try { Thread.sleep(100); } catch (InterruptedException e) {}; } } While文ですね・・ この文はanimeがnullでない間繰り返す という意味です。 ただし、animeはinitの部分で使える 状態にしたので無限ループになります。
解説① run部 public void run() { while (anime!=null) { x+=5; repaint(); if (x>500) {x=0;} try { Thread.sleep(100); } catch (InterruptedException e) {}; } } Xの値を 5増やします。
解説① run部 public void run() { while (anime!=null) { x+=5; repaint(); if (x>500) {x=0;} try { Thread.sleep(100); } catch (InterruptedException e) {}; } } paint部をもう一度実行します。
解説① run部 public void run() { while (anime!=null) { x+=5; repaint(); if (x>500) {x=0;} try { Thread.sleep(100); } catch (InterruptedException e) {}; } } もし、xが500を越えたら、 x=0にしてあげます。
解説① run部 public void run() { while (anime!=null) { x+=5; repaint(); if (x>500) {x=0;} try { Thread.sleep(100); } catch (InterruptedException e) {}; } } ここはスリープの部分です。 Sleep(100)は0.1秒まつことを意味してます。
解説① 全体の流れ まずinit部でスレッド(anime)を使える状態にします。 そしてrunの部分が呼び出され・・ ①塗りつぶした円を描く ②xの値を増やす ③0.1秒止める これらを無限に繰り返します。
こんな感じです。 どうでしょうか? 多少画面がちらついていますが、 これを解決するには ダブルバッファリングという技法を使いますが、 今日は行いません。
次に・・ ただ円を動かしただけではつまらないので 次にイメージ(画像ファイル)を 動かしてみましょう。
画像は・・ この4枚の画像を使います。 絵が下手ですいません・・
いきなりサンプル②です。 import javax.swing.*; import java.awt.*; import java.awt.image.*; public class ex7 extends JApplet implements Runnable { int x,y,flag; Thread anime=null; Image image1,image2,image3,image4;
いきなりサンプル②です。 public void init() { x=100;y=100;flag=0; image1=getImage(getCodeBase(),"s1.jpg"); image2=getImage(getCodeBase(),"s2.jpg"); image3=getImage(getCodeBase(),"s3.jpg"); image4=getImage(getCodeBase(),"s4.jpg"); anime=new Thread(this); anime.start(); }
いきなりサンプル②です。 public void paint(Graphics g) { g.setColor(Color.white); g.fillRect(0,0,500,500); if ((flag % 4)==0) g.drawImage(image1,x,y,this); if ((flag % 4)==1) g.drawImage(image2,x,y,this); if ((flag % 4)==2) g.drawImage(image3,x,y,this); if ((flag % 4)==3) g.drawImage(image4,x,y,this); }
いきなりサンプル②です。 public void run() { while (anime!=null) { x+=5; flag+=1; repaint(); if (x>500) {x=0;} try { Thread.sleep(100); } catch (InterruptedException e) {}; } } }
解説 サンプル② 宣言部 import javax.swing.*; import java.awt.*; import java.awt.image.*; public class ex7 extends JApplet implements Runnable { int x,y,flag; Thread anime=null; Image image1,image2,image3,image4;
解説 サンプル② 宣言部 import javax.swing.*; import java.awt.*; import java.awt.image.*; public class ex7 extends JApplet implements Runnable { int x,y,flag; Thread anime=null; Image image1,image2,image3,image4; 今回もこの3つをimportします
解説 サンプル② 宣言部 import javax.swing.*; import java.awt.*; import java.awt.image.*; public class ex7 extends JApplet implements Runnable { int x,y,flag; Thread anime=null; Image image1,image2,image3,image4; 今回もスレッドを使うので、このように書きます
解説 サンプル② 宣言部 import javax.swing.*; import java.awt.*; import java.awt.image.*; public class ex7 extends JApplet implements Runnable { int x,y,flag; Thread anime=null; Image image1,image2,image3,image4; 変数x、y、flagを用意します
解説 サンプル② 宣言部 import javax.swing.*; import java.awt.*; import java.awt.image.*; public class ex7 extends JApplet implements Runnable { int x,y,flag; Thread anime=null; Image image1,image2,image3,image4; スレッドはnullにしておきます
解説 サンプル② 宣言部 import javax.swing.*; import java.awt.*; import java.awt.image.*; public class ex7 extends JApplet implements Runnable { int x,y,flag; Thread anime=null; Image image1,image2,image3,image4; 4枚のイメージを定義します
解説 サンプル② init部 public void init() { x=100;y=100;flag=0; image1=getImage(getCodeBase(),"s1.jpg"); image2=getImage(getCodeBase(),"s2.jpg"); image3=getImage(getCodeBase(),"s3.jpg"); image4=getImage(getCodeBase(),"s4.jpg"); anime=new Thread(this); anime.start(); }
解説 サンプル② init部 public void init() { x=100;y=100;flag=0; image1=getImage(getCodeBase(),"s1.jpg"); image2=getImage(getCodeBase(),"s2.jpg"); image3=getImage(getCodeBase(),"s3.jpg"); image4=getImage(getCodeBase(),"s4.jpg"); anime=new Thread(this); anime.start(); } 初期値をこのようにします
解説 サンプル② init部 public void init() { x=100;y=100;flag=0; image1=getImage(getCodeBase(),"s1.jpg"); image2=getImage(getCodeBase(),"s2.jpg"); image3=getImage(getCodeBase(),"s3.jpg"); image4=getImage(getCodeBase(),"s4.jpg"); anime=new Thread(this); anime.start(); } 4枚のイメージを読み込んでいる部分です
解説 サンプル② init部 public void init() { x=100;y=100;flag=0; image1=getImage(getCodeBase(),"s1.jpg"); image2=getImage(getCodeBase(),"s2.jpg"); image3=getImage(getCodeBase(),"s3.jpg"); image4=getImage(getCodeBase(),"s4.jpg"); anime=new Thread(this); anime.start(); } スレッドを使える状況 にします
解説 サンプル② init部 public void init() { x=100;y=100;flag=0; image1=getImage(getCodeBase(),"s1.jpg"); image2=getImage(getCodeBase(),"s2.jpg"); image3=getImage(getCodeBase(),"s3.jpg"); image4=getImage(getCodeBase(),"s4.jpg"); anime=new Thread(this); anime.start(); } スレッドを開始します ここでrun()の部分が実行されます
解説 サンプル② paint部 public void paint(Graphics g) { g.setColor(Color.white); g.fillRect(0,0,500,500); if ((flag % 4)==0) g.drawImage(image1,x,y,this); if ((flag % 4)==1) g.drawImage(image2,x,y,this); if ((flag % 4)==2) g.drawImage(image3,x,y,this); if ((flag % 4)==3) g.drawImage(image4,x,y,this); }
解説 サンプル② paint部 public void paint(Graphics g) { g.setColor(Color.white); g.fillRect(0,0,500,500); if ((flag % 4)==0) g.drawImage(image1,x,y,this); if ((flag % 4)==1) g.drawImage(image2,x,y,this); if ((flag % 4)==2) g.drawImage(image3,x,y,this); if ((flag % 4)==3) g.drawImage(image4,x,y,this); } 色を白に設定し 画面を白で塗りつぶします
解説 サンプル② paint部 public void paint(Graphics g) { g.setColor(Color.white); g.fillRect(0,0,500,500); if ((flag % 4)==0) g.drawImage(image1,x,y,this); if ((flag % 4)==1) g.drawImage(image2,x,y,this); if ((flag % 4)==2) g.drawImage(image3,x,y,this); if ((flag % 4)==3) g.drawImage(image4,x,y,this); } %は余り(mod)を意味します
解説 サンプル② paint部 public void paint(Graphics g) { g.setColor(Color.white); g.fillRect(0,0,500,500); if ((flag % 4)==0) g.drawImage(image1,x,y,this); if ((flag % 4)==1) g.drawImage(image2,x,y,this); if ((flag % 4)==2) g.drawImage(image3,x,y,this); if ((flag % 4)==3) g.drawImage(image4,x,y,this); } ここは、イメージを画面に描くところです
解説 サンプル② paint部 public void paint(Graphics g) { g.setColor(Color.white); g.fillRect(0,0,500,500); if ((flag % 4)==0) g.drawImage(image1,x,y,this); if ((flag % 4)==1) g.drawImage(image2,x,y,this); if ((flag % 4)==2) g.drawImage(image3,x,y,this); if ((flag % 4)==3) g.drawImage(image4,x,y,this); } Flagに応じて描かせたいイメージを描きます
解説 サンプル② run部 public void run() { while (anime!=null) { x+=5; flag+=1; repaint(); if (x>500) {x=0;} try { Thread.sleep(100); } catch (InterruptedException e) {}; } }
解説 サンプル② run部 public void run() { while (anime!=null) { x+=5; flag+=1; repaint(); if (x>500) {x=0;} try { Thread.sleep(100); } catch (InterruptedException e) {}; } } サンプル①と同様無限ループ