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);
}
}