| 情報処理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を間違えないよう注意しましょう。