본문 바로가기

카테고리 없음

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;

}

}