情報処理2z(Java version) 課題4:オブジェクトの移動・続編 |
応用課題
難関応用課題
import java.awt.*; public class kadai404 extends java.applet.Applet implements Runnable { Thread th; ........; /* 変数宣言 */ public void init(){ th = new Thread(this); /* スレッドの設定 */ th.start(); ......; ......; /* 初期値代入 */ ......; ......; } public void paint(Graphics g){ ...........;/* g.setColor()を用いて描画色を白に変更 */ ...........;/* g.fillRect()を用いて画面をクリア(白く塗り潰す) */ ...........;/* g.setColor()を用いて描画色を黒に変更 */ ........; /* 黒い壁を描く */ ........; ........; ........; ........; /* 黒いボールをを描く */ } public void update(Graphics g){ paint(g); /* paint 呼び出しのみに変更する */ } public void run(){ while(true){ /* 無限ループ */ try{ /* 時間待ち */ Thread.sleep(30); }catch(InterruptedException e){} ........; /* ボールの移動の代入式 */ ........; if(.......){ /* 上の壁での跳ね返り処理 */ ........; ........; } if(.......){ /* 下の壁での跳ね返り処理 */ ........; ........; } if(.......){ /* 左の壁での跳ね返り処理 */ ........; ........; } if(.......){ /* 右の壁での跳ね返り処理 */ ........; ........; } repaint(); /* 再描画 */ } } public void destroy(){ th.stop(); } } |
次に画面の描画時間を最小限にする方法を紹介します。 仮想画面という概念です。
線や四角などの描画を直接アプレットに描くのではなく、 別の仮想画面を用意してそちらに描くようにします。 そして仮想画面への全ての描画が終わった後に、 一括してその仮想画面をアプレットへコピーします。 *1
この処理は以下の様に実現します。
import java.awt.*; public class kadai404 extends java.applet.Applet implements Runnable { Thread th; Image ofscr; /* 仮想画面 (オフスクリーン、ダブルバッファともいう) */ Graphics ofscr_g; /* 仮想画面を操作する Graphics */ ...;/*変数宣言*/ public void init(){ th = new Thread(this); th.start(); ofscr = createImage(200, 200); /* 仮想画面の初期化(真っ白または真っ黒) */ ofscr_g = ofscr.getGraphics(); /* ofscr_g の初期化 */ ...;/*初期化*/ } public void paint(Graphics g){ /* <仮想画面に描画> */ /* g.setColor()の代わりにofscr_g.setColor()を用いて色変更 */ /* g.setfillRect()の代わりにofscr_g.fillRect()を用いて描画 */ ................................; ................................; ................................; ................................; ................................; ................................; ................................; ................................; g.drawImage(ofscr, 0, 0, null); /* 仮想画面をアプレットにコピー */ } public void update(Graphics g){ paint(g); } public void run(){ while(true){ try{ Thread.sleep(30); }catch(InterruptedException e){} /* ボールの動きと反射の処理 */ repaint(); } } public void destroy(){ th.stop(); } } |
<難関応用課題のヒント> ボールには常に下向きの力(引力)が働いています。 あとは、床に跳ね返る前と後ではボールのスピードが違います (跳ね返り係数倍になる)。 以上をうまいことプログラムで表現してください。
To: report
cc: 自分のログイン名
Subject: 2z4
です。
Subjectを間違えないよう注意しましょう。