안드로이드 개발 질문/답변
(글 수 45,052)
\
// Hero.java
package
dave.game;
import
android.view.KeyEvent;
public
class
Hero {
private
int
x;
private
int
y;
private
int
width;
private
int
height;
private
GameView view;
private
final
int
velocity =
6
;
// 속도
private
int
dir = KeyEvent.KEYCODE_ENTER;
public
Hero(GameView view) {
this
.view = view;
width =
25
;
height =
25
;
x = (view.getWidth() - width) /
2
;
y = (view.getHeight() - height) /
2
;
}
public
int
getX() {
return
x;
}
public
int
getY() {
return
y;
}
public
int
getWidth() {
return
width;
}
public
int
getHeight() {
return
height;
}
public
void
setDir(
int
dir) {
this
.dir = dir;
}
public
void
move(){
if
(dir == KeyEvent.KEYCODE_DPAD_UP) {
this
.y -= velocity;
if
(y <
0
)
y =
0
;
}
if
(dir == KeyEvent.KEYCODE_DPAD_DOWN) {
this
.y += velocity;
if
(y > view.getHeight() -
this
.height) {
y = view.getHeight() -
this
.height;
}
}
if
(dir == KeyEvent.KEYCODE_DPAD_LEFT) {
this
.x -= velocity;
if
(x <
0
)
x =
0
;
}
if
(dir == KeyEvent.KEYCODE_DPAD_RIGHT) {
this
.x += velocity;
if
(x > view.getWidth() -
this
.width)
x = view.getWidth() -
this
.width;
}
}
}
// GameView.java
package
dave.game;
import
android.content.Context;
import
android.content.res.Resources;
import
android.graphics.Canvas;
import
android.graphics.Paint;
import
android.util.AttributeSet;
import
android.view.KeyEvent;
import
android.view.MotionEvent;
import
android.view.SurfaceView;
import
android.view.SurfaceHolder;
import
android.view.SurfaceHolder.Callback;
import
android.os.Handler;
import
android.os.Message;
import
android.graphics.Bitmap;
import
android.graphics.BitmapFactory;
public
class
GameView
extends
SurfaceView
implements
Callback {
private
LoopHandler mLoopHandler =
new
LoopHandler();
// 루프 핸들러
private
SurfaceHolder mHolder =
null
;
// 서피스 홀더
private
Resources res =
null
;
// 이미지 등의 리소스 핸들
private
Hero hero;
private
Bitmap heroImage;
private
int
i, bulletCnt =
15
;
// 한 화면에 나올 총알 갯수
private
Bullet bullet[] =
new
Bullet[bulletCnt];
// 총알들은 배열로 관리한다.]
private
int
life =
5
;
private
String lifeStr =
""
;
private
long
startTime;
private
long
playTime;
private
String timeStr =
""
;
@Override
public
boolean
onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
return
super
.onTouchEvent(event);
}
@Override
public
boolean
onKeyDown(
int
keyCode, KeyEvent event) {
// TODO Auto-generated method stub
hero.setDir(keyCode);
if
(
this
.life ==
0
) {
life =
5
;
for
(i =
0
; i < bulletCnt; i++)
bullet[i].init();
startTime = System.currentTimeMillis();
mLoopHandler.start();
}
return
super
.onKeyDown(keyCode, event);
}
class
LoopHandler
extends
Handler {
private
boolean
bStop;
@Override
public
void
handleMessage(Message msg) {
// TODO Auto-generated method stub
if
(bStop ==
false
)
GameView.
this
.loop();
super
.handleMessage(msg);
}
private
void
sleep(
long
delayMillis) {
this
.removeMessages(
0
);
sendMessageDelayed(obtainMessage(
0
), delayMillis);
}
private
void
stop() {
bStop =
true
;
}
private
void
start() {
bStop =
false
;
GameView.
this
.loop();
}
};
public
void
loop() {
// 이 곳에 루프가 돌때 실행할 내용을 적는다.
doWork();
// 계산을 한다.
doDraw();
// 그림을 그린다.
mLoopHandler.sleep(
100
);
}
private
void
doWork() {
hero.move();
for
(i =
0
; i < bulletCnt; i++) {
bullet[i].move();
if
(bullet[i].getX() > hero.getX()
&& bullet[i].getY() > hero.getY()
&& bullet[i].getX() + bullet[i].getWidth() < hero.getX()
+ hero.getWidth()
&& bullet[i].getY() + bullet[i].getHeight() < hero.getY()
+ hero.getHeight()) {
life--;
bullet[i].init();
// 충돌한 총알은 새로 생성
if
(life ==
0
) {
mLoopHandler.stop();
break
;
}
}
}
}
@Override
public
void
surfaceChanged(SurfaceHolder arg0,
int
arg1,
int
arg2,
int
arg3) {
// TODO Auto-generated method stub
}
@Override
public
void
surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
hero =
new
Hero(
this
);
heroImage = BitmapFactory.decodeResource(res, R.drawable.hero);
for
(i =
0
; i < bulletCnt; i++)
bullet[i] =
new
Bullet(hero,
this
);
startTime = System.currentTimeMillis();
mLoopHandler.start();
}
@Override
public
void
surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
mLoopHandler.stop();
}
public
GameView(Context context, AttributeSet attrs) {
super
(context, attrs);
// TODO Auto-generated constructor stub
setFocusable(
true
);
// 이 뷰가 포커스를 가지게 한다.
mHolder = getHolder();
mHolder.addCallback(
this
);
res = context.getResources();
}
private
void
doDraw() {
Canvas canvas = mHolder.lockCanvas(
null
);
// 백버퍼에 그린다.
Paint bPaint =
new
Paint(Paint.ANTI_ALIAS_FLAG);
// 검은색
bPaint.setColor(
0xff000000
);
Paint wPaint =
new
Paint(Paint.ANTI_ALIAS_FLAG);
// 흰색
wPaint.setColor(
0xffffffff
);
canvas.drawRect(
0
,
0
,
320
,
430
, wPaint);
// 화면을 희게 지운다.
// 여기에 이미지나 텍스트를 그린다.
canvas.drawBitmap(
this
.heroImage, hero.getX(), hero.getY(),
null
);
for
(i =
0
; i < bulletCnt; i++)
canvas.drawRect(bullet[i].getX(), bullet[i].getY(),
bullet[i].getX() + bullet[i].getWidth(), bullet[i].getY()
+ bullet[i].getHeight(), bPaint);
lifeStr =
"남은 생명 : "
+
this
.life;
canvas.drawText(lifeStr,
120
,
30
+ bPaint.getTextSize(), bPaint);
if
(
this
.life ==
0
)
canvas.drawText(
"게임 오버!"
,
120
,
70
+ bPaint.getTextSize(), bPaint);
playTime = (System.currentTimeMillis() - startTime) /
100
;
timeStr =
"playTime : "
+ playTime;
canvas.drawText(timeStr,
200
,
30
+ bPaint.getTextSize(), bPaint);
mHolder.unlockCanvasAndPost(canvas);
// 프론트 버퍼로 출력
}
}
이렇게 Hero.java 와 GameView.java 두 소스가 있습니다.
이 게임은 캐릭터가 있고 사방으로부터 날라오는 미사일을 피해 기록을 남기는 게임입니다.
그러나 이게임은 터치가아닌 버튼 클릭으로 방향조절하게 구현되있습니다. 이것을 터치로 방향을 바꾸는 것을 구현하려고합니다. 제가 실력이 부족해서 구현을 못하고있습니다.
원래 실행되는 게임의 x좌표만 기준으로 보자면 터치시 x좌표가 캐릭터기준으로 좌측인지 우측인지 보고 그방향으로 움직이게 구현을 하여야 겠지만 그런것은 제가 공부하면서 해보겠습니다.
저는 그냥 터치한 X좌표값을 Hero.java 클래스의 getX() 의 리턴값으로 반환하는 소스까지만 구현해주시면 감사하겠습니다.