Spriteの衝突判定
では、スプライトどうしが接触しているかどうかのチェックはどのようにすればよいのでしょうか。いわゆる「衝突判定」というやつですね。
衝突判定は、SpriteSetに用意されているメソッドを使って行います。これも、実際に簡単なサンプルを動かしてみましょう。
import com.nttdocomo.ui.*;
public class SampleIApp extends IApplication {
public void start() {
Display.setCurrent((Frame)(new MainCanvas()));
}
}
class MainCanvas extends Canvas {
Image charImg;
Sprite[] sprites;
SpriteSet set;
MainCanvas() {
setSoftLabel(SOFT_KEY_1, "END");
setBackground(Graphics.getColorOfName(Graphics.WHITE));
try {
MediaImage mi = MediaManager.getImage("resource:///char.gif");
mi.use();
charImg = mi.getImage();
sprites = new Sprite[5];
for(int i = 0;i < 5;i++){
sprites[i] = new Sprite(charImg);
}
int dx = this.getWidth() - charImg.getWidth();
int dy = this.getHeight() - charImg.getHeight();
sprites[0].setLocation(dx / 2,dy / 2);
sprites[1].setLocation(10,10);
sprites[2].setLocation(10,dy - 10);
sprites[3].setLocation(dx - 10,10);
sprites[4].setLocation(dx - 10,dy - 10);
set = new SpriteSet(sprites);
}catch(Exception e){}
}
public void paint(Graphics g) {
g.lock();
g.clearRect(0, 0, Display.getWidth(), Display.getHeight());
g.drawSpriteSet(set);
g.unlock(true);
}
public void processEvent(int type, int param) {
switch(type){
case Display.KEY_RELEASED_EVENT:
int x = sprites[0].getX();
int y = sprites[0].getY();
switch(param){
case Display.KEY_SOFT1:
(IApplication.getCurrentApp()).terminate();
break;
case Display.KEY_UP:
sprites[0].setLocation(x,y - 10);
break;
case Display.KEY_DOWN:
sprites[0].setLocation(x,y + 10);
break;
case Display.KEY_LEFT:
sprites[0].setLocation(x - 10,y);
break;
case Display.KEY_RIGHT:
sprites[0].setLocation(x + 10,y);
break;
}
checkCollision();
repaint();
}
}
public void checkCollision(){
set.setCollisionAll();
for(int i = 1;i < 5;i++){
if (set.isCollision(0,i)){
sprites[i] = null;
}
}
}
}