| 情報処理2z(Java version) 課題3:オブジェクトの移動 |
応用課題
難関応用課題
今までは paint メソッドしか使っていませんでしたが、 これ以外にも定義できるメソッドがいくつかあります。 例えば init, destroy メソッドなどがそれです。
init メソッドはアプレットが呼ばれた時、 destroy メソッドはアプレットが終了するときに呼ばれます。 基本的に init メソッドは変数の初期値などを入れるのに使いますので 覚えておいて下さい。
以下のプログラムをアプレットビューアで実行させると メソッドの実行順番がわかると思います。
import java.awt.*;
public class test extends java.applet.Applet
{
public void init(){
System.out.println("init"); /* 標準出力(この場合MS-DOS 画面)に */
} /* プリントする命令 */
public void paint(Graphics g){
g.drawLine(50, 50, 150, 150);
System.out.println("paint");
}
public void destroy(){
System.out.println("destroy");
}
}
|
アプレットを実行すると init, paint がプリントされ、 終了する時に destroy がプリントされましたね。
ここで使った System.out.println はデバッグで非常に有効に使えます。 ぜひ覚えておいて下さい。 またこの命令はアプレットビューアで見る時のみ有効なので、 この点は注意が必要です。*1
今までのプログラムは全て最初に一回だけ paint を実行するというプログラムでした。 しかし、ゲームを作る上では常に動いていてくれるメソッドが欲しいところです。 これを実現してくれるのがスレッドです。
ちょっと新しいことが多いので注意してプログラムのチェックを行って下さい。
import java.awt.*;
public class kadai301 extends java.applet.Applet implements Runnable /* (1) */
{
Thread th; /* Thread 型のフィールド変数を宣言 (2)*/
int x, y;
public void init(){
th = new Thread(this); /* 変数の初期化 (3) */
th.start(); /* スレッドの開始 */
........; /* 初期値代入 */
........;
}
public void paint(Graphics g){
........; /* (x, y) にボールを描く */
}
public void run(){ /* 継続的な処理を実行するメソッド run (4)*/
while(y < 180){
try{ /* ここから以下3行が重要 (5) */
Thread.sleep(70); /* 1回のループで止めておく時間 */
}catch(InterruptedException e){} /* 例外処理(とりあえず必要) */
........; /* ボールを動かす */
repaint(); /* paint メソッド呼び出し */
}
}
public void destroy(){
th.stop(); /* スレッドの終了 (6) */
}
}
|
これで、継続的な処理が行えます。 ちなみに
Thread.sleep(70);の 70 のところはミリ秒です。 処理のスピードを変更したい場合はここを変更しましょう。
次に run メソッドの中身です。 どのように書けばボールが動いているように見えるのでしょうか。 もう1回 "kadai301.java" を見てみます。
import java.awt.*;
public class kadai301 extends java.applet.Applet implements Runnable
{
Thread th;
int x, y; /* ボールの x, y 座標をフィールド変数で宣言 */
public void init(){
th = new Thread(this);
th.start();
........; /* 初期値代入 */
........;
}
public void paint(Graphics g){
........; /* (x, y) にボールを描く */
}
public void run(){
while(y < 180){ /* ボール移動のループ */
try{
Thread.sleep(70);
}catch(InterruptedException e){}
........; /* ボールを動かす */
repaint(); /* paint メソッド呼び出し */
}
}
public void destroy(){
th.stop();
}
}
|
while ループの中で y を使ってボールの移動の制御をしています。
repaint() は画面をクリアしてから paint メソッドを呼び出す命令です。 よって描いたボールを消す作業は必要ありません。
また、 2番以降の課題では while 文のところを無限ループにする必要がありますが、 その書き方が C とは少し違います。以下の様に書きます。 *2
[*2] true は変数ではなく、C にはない boolean 型の定数です。
boolean 型は真偽値型で true (真)、false(偽)の二つの値しかとりません。
|