反射するごとに色変え

ボールが反射する度に色を変えるようにします。さっきは

g.setColor(255);

と書き換えましたが、ここを

g.setColor(ballColor);

にして、反射するたびに変数ballColorの値を変えてやれば良いでしょう。

まずはインスタンス変数ballColorを追加します。SmallBall.javaの69、70行目に

// public variables to control the behaviour of the thread
public boolean stop;

があるので、この後ろに

private int ballColor;

の一行を追加します。次にコンストラクタ

SmallBall(Canvas c, int left, int top, int width, int height) {
}

の最後に

ballColor = 255 * 256 * 256;

を追加してballColorが初期化されるようにします。ここでは最初にボールの色が赤になるようにしてます。


次に反射する毎にballColorの値を変えます。反射するときの処理はrunメソッドの中にある

if (collision != 0) {
}

のifブロックで行なわれてます。このブロックの最後、すなわち

deltaX = matrix[direction+2][collision];
deltaY = matrix[direction+2][collision+1];

の後ろに

int r = (random.nextInt() >>> 1) % 256;
int g = (random.nextInt() >>> 1) % 256;
int b = (random.nextInt() >>> 1) % 256;
ballColor = r * 256 * 256 + g * 256 + b;

を追加します。何してるか解りますか?

あとは先ほど

g.setColor(255);

に変更したpaintメソッドの中の一行を

g.setColor(ballColor);

に変更します。コンパイル・検証・実行してみましょう。

D:\midp-fcs\segi\manyballs>javac -d . -bootclasspath /midp-fcs/classes SmallBall.java
D:\midp-fcs\segi\manyballs>preverify -classpath .;/midp-fcs/classes example.manyballs.SmallBall
D:\midp-fcs\segi\manyballs>cd output
D:\midp-fcs\segi\manyballs\output>midp example.manyballs.ManyBalls

一応、動きますね。

でも背景が白だと色が映えないと思いませんか?これはManyCanvas.javapaintメソッドを変更すれば変えられます。

あと文字の色が変わってしまうのはSmallBall.javapaintメソッドでg.fillArc()した後にg.setColor(0)とかしとけば良いです。いずれもお試しください。


前の項目へ次の項目へ
「MIDPで遊ぼう!」のページへ
せぎてつ伝言板
このページの感想をどうぞ!
お名前(匿名OK):

メールアドレス:
最終更新日 : 2000年10月7日(土)
tetsu@segi.org