본문 바로가기

카테고리 없음

Android Game example, No Upward Missiles

Android Game example, No Upward Missiles

적기가 아군기보다 아래에 있을 때는 위를 향하여 미사일을 발사하지 못하도록 설정한 예

EnemyPlane.java

package game.framework;


import java.util.*;

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, 2);

AppManager.getInstance().enemyList.add(this);


prevFireTime = System.currentTimeMillis();

rd = new Random();

y = 0;

}


@Override

public void update() {

if(inuse) {

if(this.x==0 && this.y==0) return;

x += speedX;

y += speedY;

rect.left = (int)x;

rect.top = (int)y;

rect.bottom = bitmap.getHeight()+(int)y;

rect.right = bitmap.getWidth()+(int)x;

fireMissile();

}

}


@Override

public void draw(Canvas canvas) {

if(inuse) {

if(this.x==0 && this.y==0) {

this.x = rd.nextInt(canvas.getWidth()-bitmap.getWidth());

this.y = -(bitmap.getHeight());

}

}


if(!inuse) return;

if(y>canvas.getHeight()) inuse = false;

canvas.drawBitmap(bitmap, x, y, null);

}


@Override

public void fireMissile() {

Vector2D misVec = missileVector();

if(misVec.y<0) { // 미사일이 위를 향할 때 벡터의 y 성분은 음수가 된다

//Log.i("미사일 방향", "아래에서 위로 향하는 미사일은 없도록 함");

return;

}

long currentTime = System.currentTimeMillis();

if(!(currentTime-prevFireTime > 3000) ) return;

if(rd.nextInt(30)!=0) return;

Missile misToFire = null;

//적기용 미사일 풀에서 사용하지 않은 미사일을 찾아 온다

for(int i=0;i<EnemyMisPool.getInstance().pool.size();i++) {

if( ! EnemyMisPool.getInstance().pool.get(i).inuse) {

misToFire = EnemyMisPool.getInstance().pool.get(i);

Log.i("미사일선택", "미사일 재사용");

break; 

}

}

if(misToFire==null) { // 재사용 가능한 미사일이 없다면 새로 생성한다

misToFire = new Missile(AppManager.getInstance().getBitmap(R.drawable.enemy_missile));

Log.i("미사일선택", "미사일 새로 생성");

EnemyMisPool.getInstance().pool.add(misToFire);

}


misToFire.setPosition(this.x+(bitmap.getWidth()/2)-(misToFire.bitmap.getWidth()/2), 

this.y+bitmap.getHeight()/2);

//Log.i("미사일 사선벡터", ""+misVec.x+","+misVec.y);

misToFire.setSpeed(misVec.x, misVec.y);

misToFire.inuse = true;

prevFireTime = currentTime;

}

/* 적기와 아군기의 방향을 계산하여 미사일의 이동 방향을 산출함 */

private Vector2D missileVector() {

Airplane ap = AppManager.getInstance().getAirplane();

Vector2D apVec = new Vector2D(ap.x, ap.y);

Vector2D eneVec = new Vector2D(this.x, this.y);

return apVec.sub(eneVec).normalize().mul(4);

}

}