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