Android Game example, Collision Check 2
Android Game example, Collision Check 2
적기에서 발사한 미사일이 아군기에 명중하면 아군기가 사라지도록 설정한 예
GameState.java
package game.framework;
import java.util.ArrayList;
import android.graphics.*;
import android.util.*;
import android.view.KeyEvent;
import android.view.MotionEvent;
public class GameState implements IState {
Background background;
BackgroundClouds clouds;
Airplane airplane;
GameKeyPad keyPad;
EnemyPlane enemyPlane;
SpriteAnimation expAni;
boolean isCollided;
public GameState() {
keyPad = new GameKeyPad();
airplane = new Airplane();
airplane.init();
airplane.inuse = true;
enemyPlane = new EnemyPlane();
enemyPlane.inuse = true;
background = new Background();
clouds = new BackgroundClouds();
expAni = new SpriteAnimation(AppManager.getInstance().getBitmap(R.drawable.explosion_transparent));
expAni.initSpriteData(4, 4, expAni.bitmap.getWidth()/4, expAni.bitmap.getHeight()/4,
16, 16);
}
@Override
public void init() { }
@Override
public void destroy() { }
@Override
public void update() {
background.update();
clouds.update();
airplane.update();
if(enemyPlane.inuse) enemyPlane.update();
collisionCheck();
collisionCheck2();
if(isCollided) expAni.update(System.currentTimeMillis());
}
@Override
public void render(Canvas canvas) {
background.draw(canvas);
clouds.draw(canvas);
airplane.draw(canvas);
if(enemyPlane.inuse) enemyPlane.draw(canvas);
if(isCollided) expAni.draw(canvas);
if(expAni.currentFrame==expAni.cntOfFrames-1) isCollided = false;
keyPad.draw(canvas);
}
/* 아군의 미사일과 적기의 충돌검사 */
public void collisionCheck() {
ArrayList<EnemyPlane> enemyList = AppManager.getInstance().enemyList;
ArrayList<Missile> misList = airplane.misList;
int enemyCnt = enemyList.size();
for(int i=0;i<misList.size();i++) {
if(!misList.get(i).inuse) continue;
for(int k=0;k<enemyCnt;k++) {
if(!enemyList.get(k).inuse) continue;
if(misList.get(i).rect.intersect(enemyList.get(k).rect)) {
// 충돌탐지/충돌위치에 폭발애니 출력/적기, 미사일 안보이게 처리
expAni.setPosition(misList.get(i).x-expAni.spriteWidth/2,
misList.get(i).y-expAni.spriteHeight/2-20);
misList.get(i).inuse = false;
enemyList.get(i).inuse = false;
isCollided = true;
return;
}
}
}
}
/* 적기의 미사일과 아군기의 충돌검사 */
public void collisionCheck2() {
if(! airplane.inuse) return;
ArrayList<EnemyPlane> enemyList = AppManager.getInstance().enemyList;
for(int i=0;i<enemyList.size();i++) {
if(!enemyList.get(i).inuse) continue;
ArrayList<Missile> misList = enemyList.get(i).misList;
for(int k=0;k<misList.size();k++) {
if(!misList.get(k).inuse) continue;
if(misList.get(k).rect.intersect(airplane.rect)) {
Log.i("충돌검사", "아군기 피격");
/* 충돌탐지/충돌위치에 폭발애니 출력/비행기, 미사일 안보이게 처리 */
expAni.setPosition(airplane.x, airplane.y);
misList.get(k).inuse = false;
airplane.inuse = false;
isCollided = true;
return;
}
}
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return keyPad.onTouchEvent(event);
}
}
EnemyPlane.java
package game.framework;
import java.util.Random;
import android.graphics.Canvas;
import android.util.Log;
public class EnemyPlane extends Airplane {
long prevFireTime;
Random rd;
public EnemyPlane() {
super(AppManager.getInstance().getBitmap(R.drawable.enemy_transparent));
setSpeed(0, 1);
AppManager.getInstance().enemyList.add(this);
prevFireTime = System.currentTimeMillis();
rd = new Random();
y = 0;
}
@Override
public void update() {
super.update();
fireMissile();
}
@Override
public void draw(Canvas canvas) {
if(this.x==0 && this.y==0) {
this.x = canvas.getWidth()/2-bitmap.getWidth()/2;
this.y = 0;
}
for(int i=0;i<misList.size();i++) {
if(misList.get(i).inuse) misList.get(i).draw(canvas);
}
canvas.drawBitmap(bitmap, x, y, null);
}
@Override
public void fireMissile() {
long currentTime = System.currentTimeMillis();
if(!(currentTime-prevFireTime > 3000) ) return;
if(rd.nextInt(30)!=0) return;
Missile misToFire = null;
for(int i=0;i<misList.size();i++) {
if( ! misList.get(i).inuse) {
misToFire = misList.get(i);
Log.i("미사일선택", "미사일 재사용");
break;
}
}
if(misToFire==null) {
misToFire = new Missile(AppManager.getInstance().getBitmap(R.drawable.enemy_missile));
Log.i("미사일선택", "미사일 새로 생성");
misList.add(misToFire);
}
misToFire.setPosition(this.x+(bitmap.getWidth()/2)-(misToFire.bitmap.getWidth()/2), this.y);
misToFire.setSpeed(0, 4);
misToFire.inuse = true;
prevFireTime = currentTime;
}
}
Airplane.java
package game.framework;
import java.util.*;
import android.graphics.*;
import android.util.Log;
public class Airplane extends GraphicObject {
int speedX, speedY;
ArrayList<Missile> misList = new ArrayList<Missile>();
Rect rect = new Rect();
boolean inuse;
public Airplane() {
super(AppManager.getInstance().getBitmap(R.drawable.mustang_transparent));
}
public Airplane(Bitmap bitmap) {
super(bitmap);
}
public void init() {
AppManager.getInstance().setAirplane(this);
}
public void setSpeed(int speedX, int speedY) {
this.speedX = speedX;
this.speedY = speedY;
}
public void update() {
if(!inuse) return;
if(this.x==0 && this.y==0) return;
x += speedX;
y += speedY;
rect.left = x;
rect.top = y;
rect.bottom = bitmap.getHeight()+y;
rect.right = bitmap.getWidth()+x;
for(int i=0;i<misList.size();i++) {
if(misList.get(i).inuse) misList.get(i).update();
}
}
public void draw(Canvas canvas) {
if(!inuse) return;
if(this.x==0 && this.y==0) {
this.x = canvas.getWidth()/2-bitmap.getWidth()/2;
this.y = canvas.getHeight()-bitmap.getHeight();
}
for(int i=0;i<misList.size();i++) {
if(misList.get(i).inuse) misList.get(i).draw(canvas);
}
canvas.drawBitmap(bitmap, x, y, null);
}
public void fireMissile() {
Missile misToFire = null;
for(int i=0;i<misList.size();i++) {
if( ! misList.get(i).inuse) {
misToFire = misList.get(i);
//Log.i("미사일선택", "미사일 재사용");
break;
}
}
if(misToFire==null) {
misToFire = new Missile();
//Log.i("미사일선택", "미사일 새로 생성");
misList.add(misToFire);
}
misToFire.setPosition(this.x+(bitmap.getWidth()/2)-(misToFire.bitmap.getWidth()/2), this.y);
misToFire.setSpeed(0, -4);
misToFire.inuse = true;
}
}
Missile.java
package game.framework;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
public class Missile extends GraphicObject {
int speedX, speedY;
int bitmapHeight;
boolean inuse;
Rect rect = new Rect();
public Missile() {
super(AppManager.getInstance().getBitmap(R.drawable.missile));
bitmapHeight = bitmap.getHeight();
}
public Missile(Bitmap bitmap) {
super(bitmap);
bitmapHeight = bitmap.getHeight();
}
public void setSpeed(int speedX, int speedY) {
this.speedX = speedX;
this.speedY = speedY;
}
public void update() {
if(!inuse) return;
y += this.speedY;
rect.left = x;
rect.top = y;
rect.bottom = bitmap.getHeight()+y;
rect.right = bitmap.getWidth()+x;
if(y< -bitmapHeight) {
inuse = false;
}
}
public void draw(Canvas canvas) {
if(!inuse) return;
if(y>canvas.getHeight()) inuse = false;
canvas.drawBitmap(bitmap, x, y, null);
}
}
AppManager.java
package game.framework;
import java.util.ArrayList;
import android.content.res.*;
import android.graphics.*;
import android.util.Log;
public class AppManager {
private GameView gameView;
private Resources resources;
private Airplane airplane;
ArrayList<EnemyPlane> enemyList = new ArrayList<EnemyPlane>();
private AppManager() {}
void setGameView(GameView gameView) {
this.gameView = gameView;
}
void setResources(Resources resources ){
this.resources = resources;
}
public GameView getGameView() {
return gameView;
}
public Resources getResources() {
return resources;
}
public Bitmap getBitmap(int resId) {
return BitmapFactory.decodeResource(getResources(), resId);
}
public Airplane getAirplane() {
return airplane;
}
public void setAirplane(Airplane airplane) {
this.airplane = airplane;
}
private static AppManager instance;
public static AppManager getInstance() {
if(instance==null) instance = new AppManager();
return instance;
}
}