タイマーでスプライトをリアルタイムに動かす (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(); } }
※関連コンテンツ