タイマーでスプライトをリアルタイムに動かす (3/5)
作成:2009-12-30 10:06
更新:2009-12-30 10:06
更新:2009-12-30 10:06
■タイマーでボールを動かす
では、実際に簡単なサンプルを作ってみましょう。ここでは、image.jpgというイメージを用意し、これを読み込んでタイマーを使って動かしてみましょう。image.jpgは、32×32ドットで作成し、「res」フォルダ内にコピーしておいてください。そして、MainCanvasクラスを以下のリストのように修正します。
ここでは、image.jpgをランダムな方向にゆっくりと動かしています。ソフトキーの「GO!」を押すと、アニメーションを開始し、「STOP」を押すと停止します。上下左右の端までいくと、またランダムな速さで跳ね返ってきます。
ここでは、イメージを表示する位置を示す変数x,yと、これらに加算する値を示すdx,dyを用意しています。そして、timerExpiredではdx,dyをx,yに加算し、表示する位置を少しずつ変更しています。後は、現在位置が端まできてしまった場合には、dx,dyの値をゼロに戻し、再設定するようにします。
dx,dyの値は、Randomを使って-10~10の間で指定しています。Randomは、Java SEのjava.utilにあるクラスですが、これはDoJaでも使うことができます。といってもJava SEの全機能が使えるわけではありません。DoJaの土台となっている、Java MEの「CLDC」というコンフィグレーション(想定実行環境)に、Randomは用意されています。このため使うことができるのです。DoJaの開発では、DoJa独自のクラスの他に、この「CLDCに用意されているJava標準のクラス」も使うことができます。
ここでは、image.jpgをランダムな方向にゆっくりと動かしています。ソフトキーの「GO!」を押すと、アニメーションを開始し、「STOP」を押すと停止します。上下左右の端までいくと、またランダムな速さで跳ね返ってきます。
ここでは、イメージを表示する位置を示す変数x,yと、これらに加算する値を示すdx,dyを用意しています。そして、timerExpiredではdx,dyをx,yに加算し、表示する位置を少しずつ変更しています。後は、現在位置が端まできてしまった場合には、dx,dyの値をゼロに戻し、再設定するようにします。
dx,dyの値は、Randomを使って-10~10の間で指定しています。Randomは、Java SEのjava.utilにあるクラスですが、これはDoJaでも使うことができます。といってもJava SEの全機能が使えるわけではありません。DoJaの土台となっている、Java MEの「CLDC」というコンフィグレーション(想定実行環境)に、Randomは用意されています。このため使うことができるのです。DoJaの開発では、DoJa独自のクラスの他に、この「CLDCに用意されているJava標準のクラス」も使うことができます。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
※MainCanvasの修正
// import java.util.*;
// import com.nttdocomo.util.*;
class MainCanvas extends Canvas implements TimerListener {
private Image image;
private int x, y, dx, dy, w, h;
private Random random;
private Timer timer;
private boolean flg;
MainCanvas() {
this.setSoftLabel(Frame.SOFT_KEY_1, "GO!");
this.setSoftLabel(Frame.SOFT_KEY_2, "EXIT");
random = new Random(new Date().getTime());
timer = new Timer();
timer.setTime(100);
timer.setRepeat(true);
timer.setListener(this);
try {
MediaImage mi = MediaManager.getImage("resource:///image.gif");
mi.use();
image = mi.getImage();
} catch (ConnectionException e) {}
w = Display.getWidth() - image.getWidth();
h = Display.getHeight() - image.getHeight();
}
public void paint(Graphics g) {
g.lock();
g.clearRect(0, 0, this.getWidth(), this.getHeight());
g.drawImage(image, x, y);
g.unlock(true);
}
public void processEvent(int type, int param) {
super.processEvent(type, param);
switch (type) {
case Display.KEY_PRESSED_EVENT:
switch (param) {
case Display.KEY_SOFT1:
if (!flg){
timer.start();
this.setSoftLabel(Frame.SOFT_KEY_1, "STOP");
flg = true;
} else {
timer.stop();
this.setSoftLabel(Frame.SOFT_KEY_1, "GO!");
flg = false;
}
break;
case Display.KEY_SOFT2:
IApplication.getCurrentApp().terminate();
break;
}
repaint();
}
}
public void timerExpired(Timer t) {
if (dx == 0){
dx = random.nextInt(11) - 5;
}
if (dy == 0){
dy = random.nextInt(11) - 5;
}
x += dx;
y += dy;
if (x < 0){
dx = 0;
x = 0;
}
if (x > w){
dx = 0;
x = w;
}
if (y < 0){
dy = 0;
y = 0;
}
if (y > h){
dy = 0;
y = h;
}
repaint();
}
}
※関連コンテンツ