본문 바로가기

카테고리 없음

Android Shooting Game example Multi Missiles

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

}

}