Android Shooting Game example, Multi Missiles
키패드의 Fire 키를 여러번 눌러서 다수개의 미사일을 발사하고, 화면을 벗어난 미사일을 재사용하는 예
다른 구성 파일은 이곳을 참고하세요(http://micropilot.tistory.com/category/Android%20Game/Key%20Pad,%20Airplane)
GameKeyPad.java
package game.framework;
import android.graphics.*;
import android.util.Log;
import android.view.MotionEvent;
/* 화면에 키패를 그려주고 그 키패드에서 발생하는 터치 이벤트를 처리한다 */
public class GameKeyPad extends GraphicObject {
Paint paint;
Rect leftRect, topRect, rightRect, bottomRect,centerRect;
int x, y;
public GameKeyPad(){
super(AppManager.getInstance().getBitmap(R.drawable.gamepad));
paint = new Paint();
paint.setAlpha(150);
leftRect = new Rect(21, 54, 56, 90);
topRect = new Rect(55, 22, 90, 56);
rightRect = new Rect(90, 56, 123, 90);
bottomRect = new Rect(56, 90, 91, 125);
centerRect = new Rect(59, 59, 88, 88);
}
public GameKeyPad(int kpx, int kpy) {
super(AppManager.getInstance().getBitmap(R.drawable.gamepad));
paint = new Paint();
paint.setAlpha(150);
leftRect = new Rect(kpx+21, kpy+54, kpx+56, kpy+90);
topRect = new Rect(kpx+55, kpy+22, kpx+90, kpy+56);
rightRect = new Rect(kpx+90, kpy+56, kpx+123, kpy+90);
bottomRect = new Rect(kpx+56, kpy+90, kpx+91, kpy+125);
centerRect = new Rect(kpx+59, kpy+59, kpx+88, kpy+88);
}
/** 생성자 호출 후에는 이 메소드를 호출하여 키패드의 화면상의 위치를 지정할 수 있다.
* 그렇지 않으면 화면의 좌하단 구석에 키패드가 위치하게 된다.
*/
public void setPosition(int x, int y) {
this.x = x;
this.y = y;
leftRect.left+=x; leftRect.top+=y; leftRect.right+=x; leftRect.bottom+=y;
topRect.left+=x; topRect.top+=y; topRect.right+=x; topRect.bottom+=y;
rightRect.left+=x; rightRect.top+=y; rightRect.right+=x; rightRect.bottom+=y;
bottomRect.left+=x; bottomRect.top+=y; bottomRect.right+=x; bottomRect.bottom+=y;
centerRect.left+=x; centerRect.top+=y; centerRect.right+=x; centerRect.bottom+=y;
}
public void draw(Canvas canvas) {
if(x==0 && y==0) setPosition (0,canvas.getHeight()-bitmap.getHeight()); // 좌하단 구석
canvas.drawBitmap(bitmap, x, y, paint);
}
public boolean onTouchEvent(MotionEvent event) {
int x = (int)event.getX();
int y = (int)event.getY();
Airplane airplane = AppManager.getInstance().getAirplane();
int action = event.getAction();
if(action==event.ACTION_DOWN) {
if(centerRect.contains(x, y))airplane.fireMissile();
else if(leftRect.contains(x,y)) airplane.setSpeed(-2, 0);
else if(topRect.contains(x,y)) airplane.setSpeed(0, -2);
else if(rightRect.contains(x,y)) airplane.setSpeed(2, 0);
else if(bottomRect.contains(x,y)) airplane.setSpeed(0, 2);
}else if(action==event.ACTION_UP) {
airplane.setSpeed(0, 0);
}
return true;
}
}
GameState.java
package game.framework;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
public class GameState implements IState {
GameKeyPad keyPad;
Airplane airplane;
public GameState() {
keyPad = new GameKeyPad();
airplane = new Airplane();
}
@Override
public void init() { }
@Override
public void destroy() { }
@Override
public void update() {
airplane.update();
}
@Override
public void render(Canvas canvas) {
airplane.draw(canvas);
keyPad.draw(canvas);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return keyPad.onTouchEvent(event);
}
}
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>();
public Airplane() {
super(AppManager.getInstance().getBitmap(R.drawable.mustang_transparent));
AppManager.getInstance().setAirplane(this);
}
public Airplane(Bitmap bitmap) {
super(bitmap);
AppManager.getInstance().setAirplane(this);
}
public void setSpeed(int speedX, int speedY) {
this.speedX = speedX;
this.speedY = speedY;
}
public void update() {
if(this.x==0 && this.y==0) return;
x += speedX;
y += speedY;
for(int i=0;i<misList.size();i++) {
if(misList.get(i).speedY!=0) misList.get(i).update();
}
}
public void draw(Canvas canvas) {
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).speedY!=0) 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;
public class Missile extends GraphicObject {
int speedX, speedY;
int bitmapHeight;
boolean inuse;
public Missile() {
super(AppManager.getInstance().getBitmap(R.drawable.missile));
bitmapHeight = bitmap.getHeight();
}
public Missile(Bitmap bitmap) {
super(bitmap);
}
public void setSpeed(int speedX, int speedY) {
this.speedX = speedX;
this.speedY = speedY;
}
public void update() {
y += this.speedY;
if(y< -bitmapHeight) {
this.speedY = 0;
inuse = false;
}
}
public void draw(Canvas canvas) {
canvas.drawBitmap(bitmap, x, y, null);
}
}