タイマーでスプライトをリアルタイムに動かす (5/5)
作成:2009-12-30 10:09
更新:2009-12-30 10:09
更新:2009-12-30 10:09
■スプライトで多数のキャラクタを動かす
では、実際にスプライトを使って多数のイメージを動かしてみましょう。ここでは、image.jpgとimage2.jpgというイメージ(いずれも32×32)を使い、5つのイメージを動かし、衝突して消していくサンプルを作ってみます。
起動すると、画面の四隅にimage2.jpgが、中央にimage.jpgが表示されます。「GO!」ボタンを押すと、それぞれがランダムな向きと速度で動き出します。中央のimage.jpgとそれ以外のimage2.jpgが接触すると、image2.jpgは消され、最終的にはimaeg.jpgが1つだけになります。
スプライト関係の準備はsetUpで行っています。またtimerExpiredでは位置と移動方向の再設定をし、checkCollisionで衝突判定をしています。衝突している場合には、Sprite配列の衝突したSpriteが入っている要素をnullにしています。こうすることで、そのスプライトが消えます。
に非表示にしたい場合は、Spriteの「setVisible」を呼び出して表示をOFFにする方法もあります。
スプライトは、特にリアルタイムゲームを作る場合には必須の機能です。ここで基本を理解し、実際に多数のイメージを動かして、扱いに慣れておきましょう。
起動すると、画面の四隅にimage2.jpgが、中央にimage.jpgが表示されます。「GO!」ボタンを押すと、それぞれがランダムな向きと速度で動き出します。中央のimage.jpgとそれ以外のimage2.jpgが接触すると、image2.jpgは消され、最終的にはimaeg.jpgが1つだけになります。
スプライト関係の準備はsetUpで行っています。またtimerExpiredでは位置と移動方向の再設定をし、checkCollisionで衝突判定をしています。衝突している場合には、Sprite配列の衝突したSpriteが入っている要素をnullにしています。こうすることで、そのスプライトが消えます。
に非表示にしたい場合は、Spriteの「setVisible」を呼び出して表示をOFFにする方法もあります。
スプライトは、特にリアルタイムゲームを作る場合には必須の機能です。ここで基本を理解し、実際に多数のイメージを動かして、扱いに慣れておきましょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
※MainCanvasの修正 class MainCanvas extends Canvas implements TimerListener { private int w, h; private int[][] data; private Random random; private Timer timer; private boolean flg; private Sprite[] sprites; private SpriteSet spriteset; private static final int _DX = 0; private static final int _DY = 1; MainCanvas() { this.setSoftLabel(Frame.SOFT_KEY_1, "GO!"); this.setSoftLabel(Frame.SOFT_KEY_2, "EXIT"); data = new int[5][2]; random = new Random(new Date().getTime()); timer = new Timer(); timer.setTime(100); timer.setRepeat(true); timer.setListener(this); Image image = null; Image image2 = null; try { MediaImage mi = MediaManager.getImage("resource:///image.gif"); mi.use(); image = mi.getImage(); MediaImage mi2 = MediaManager.getImage("resource:///image2.gif"); mi2.use(); image2 = mi2.getImage(); } catch (ConnectionException e) { } w = Display.getWidth() - image.getWidth(); h = Display.getHeight() - image.getHeight(); setUp(image, image2); } public void setUp(Image image, Image image2) { int xx[] = new int[] { w / 2, 0, 0, w, w }; int yy[] = new int[] { h / 2, 0, h, 0, h }; sprites = new Sprite[5]; spriteset = new SpriteSet(sprites); sprites[0] = new Sprite(image); sprites[0].setLocation(xx[0], yy[0]); for (int i = 1; i < 5; i++) { sprites[i] = new Sprite(image2); sprites[i].setLocation(xx[i], yy[i]); } } public void paint(Graphics g) { g.lock(); g.clearRect(0, 0, this.getWidth(), this.getHeight()); if (spriteset != null) g.drawSpriteSet(spriteset); 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) { for (int i = 0; i < 5; i++) { if (sprites[i] == null) continue; if (data[i][_DX] == 0) { data[i][_DX] = random.nextInt(11) - 5; } if (data[i][_DY] == 0) { data[i][_DY] = random.nextInt(11) - 5; } int xx = sprites[i].getX() + data[i][_DX]; int yy = sprites[i].getY() + data[i][_DY]; if (xx < 0) { xx = 0; data[i][_DX] = 0; } if (xx > w) { xx = w; data[i][_DX] = 0; } if (yy < 0) { yy = 0; data[i][_DY] = 0; } if (yy > h) { yy = h; data[i][_DY] = 0; } sprites[i].setLocation(sprites[i].getX() + data[i][_DX], sprites[i].getY() + data[i][_DY]); } checkCollision(); repaint(); } public void checkCollision() { spriteset.setCollisionAll(); for (int i = 1; i < 5; i++) { if (spriteset.isCollision(0, i)) { sprites[i] = null; } } } }
※関連コンテンツ