인터넷 강좌보면서 게임을 만들어보고 있습니다. 어느정도 강좌를 보다가 응용해서 만들던 중에 막히는 부분이 있어 질문드립니다.
메인 Activity에서
setContentView(new MyGameView(this));
로 서피스뷰를 메인에 표시하고있습니다.
public class MyGameView extends SurfaceView implements Callback {
안에는 쓰레드를 넣었고
public void surfaceCreated(SurfaceHolder arg0) {
mThread.start();
}
뷰가 생성될때 쓰레드를 스타트합니다.
쓰레드안의 run에서는 기본적인 이미지들을 화면에 표시합니다.
public void run() {
while (true) {
Canvas canvas = null;
canvas = mHolder.lockCanvas();
try {
synchronized (mHolder) {
canvas.drawBitmap(imageBack, 0, 0, null);
}
} finally {
mHolder.unlockCanvasAndPost(canvas);
}
} // while
} // run()
(소스는 현제 재가 만든 소스가 아니라 보고있는 강좌의 예제입니다)
질문1.
run()의 while(true)안에 이미지를 배치하면 정확히 모르겠지만 빠른 일정 시간 간격으로 try안에 있는 내용을 실행하는데..
이 동작의 원리가 궁금합니다. 주기적으로 surfaceCreated가 호출되서 쓰레드가 돌아가는건지...아니면 surfaceCreated는 처음 뷰를 호출할때 한번만 호출고 run()이 주기적으로 호출되는건지...아니면 surfaceCreated이랑 run 둘다 한번만 호출되는건데 while(true)로 되어있어서 여기서 계속 표시동작을 하는건지...궁금합니다. 사실 제 생각으론 run은 한번만 호출되고 while이 계속 도니까 계속 쓰레드 안에서 이미지를 표시해 주고 있다고..생각하는데 정확히 알고 싶습니다 ㅠ.
질문2
사실 이게 제가 진짜로 막힌 부분입니다. run안에서 canvas.drawBitmap(imageBack, 0, 0, null);를 0대신에 x--; 이런식으로 변수넣고 루프 돌때마다 바꿔주면 화면상에서 이미지가 이동하는데요...이게 어떤속도로 루프들 돌고있는지 모르겠으나 이걸 시간을 직접 설정하고 싶습니다. 예를들어 1ms마다 1px씩 왼쪽으로 이동하도록 설정하고 싶은데...머리싸매고 생각해봐도 어떤식으로 코딩을 해야할지 잘 모르겠습니다 ㅠ.
자세한 설명을 위해 제가 만들고있는 소스를 일부 올리겠습니다.
public void run() {
while (true) {
Canvas canvas = null;
canvas = mHolder.lockCanvas();
try {
synchronized (mHolder) {
canvas.drawBitmap(topgaugebar, 0, 0, null);
canvas.drawBitmap(touchzone, touchzoneX, touchzoneY, null);
canvas.drawBitmap(gauge, gaugeX, gaugeY, null);
canvas.drawBitmap(mapView, 0, S_TopGbarY, null);
canvas.drawBitmap(caracterView, characterX, characterY, null);
canvas.drawBitmap(monsterView, monsterX, monsterY, null);
}
} finally {
mHolder.unlockCanvasAndPost(canvas);
}
} // while
} // run()
이런식으로해서 배경과 캐릭터 이미지를 기본적으로 표시하고있습니다.
이때 화면을 한번 터치하면 네모난 박스 이미지를 오른쪽화면 끝에서 왼쪽으로 1ms마다 1px씩 이동시키고 싶습니다. 이럴 경우 어떻게 해야하는지 잘 모르겠습니다..한가지 방법으로는 서피스 뷰안에 전역변수로 쓰레드를 하나 더 만들고. 터치이벤트에서 ACTION_DOWN되면 새로만든 쓰레드를 호출합니다. 그 쓰레드의 run에서 네모박스 이미지를 화면 오른쪽위에 표시하고 1ms마다 루프를 돌면서 width좌표를 -1씩 해줍니다. 이런식의 구현방식이 가능할까요?
그리고 쓰레드안에서 1ms마다 루프를 어떻게 돌리면 되는지 모르겠습니다..인터넷 찾아보니까 sleep(1000)하면 1초마다 쓰레드를 돌린다는 것 같은데...그러면 제가 위쪽에서 적었던 while(true)에서 계속 돌고있는게 아니라 run이 일정 주기로 호출되고 있다는 얘기인 것 같기도하고...머리가 복잡해서 정리가 잘 안됩니다 ㅠ.ㅠ...
기본적인 이해가 부족해서 질문도 좀 두서가 없지만 알려주시면 감사하겠습니다.
블로그에 만들고있는 어플의 실행 이미지를 올렸습니다. 여기 직접 첨부가 가능하지만 회사라서 제가 올린거긴 하지만 가끔 뜬금없는대서 악성코드로 잡아버리는 경우가있어 이미지 다운받기가 좀 무서워서 주소 적어놓겠습니다. 번거로우시겠지만 부탁드립니다.
http://blog.naver.com/ktshas/220035534372