제가봐도 터무니없는 질문을 부끄럽게 올렸었는데, 친절히 답변달아주신분들에게 깊은 감사의 말씀 전해드립니다.
현재, 게임의 최종 로직을 짜고 있습니다.
제가 생각한 로직은 이렇습니다.
1. UI쓰레드는 가속도센서를 감지, 계산하여 점수를 누적한다.
2. UI쓰레드에 종속적인 TimerThread라는 데몬쓰레드를 작성한다.
3. TimerThread는 루프를 순회하며, 1초의 간격으로(Thread.sleep(1000)) UI쓰레드에게 카운트한 시간(초단위)을 넘겨준다.
4. UI쓰레드는 초단위의 시간을 읽으며, 제한시간이 되면, 현재 액티비티를 종료하고, 새로운 액티비티를 호출하여, 게임 결과를 보여준다.
아래의 코드는 제가 구현해둔 UI 쓰레드의 일부입니다.
- public class GameStart extends Activity implements SensorEventListener
- {
- ...
- // 디버깅용 토스트, 스트링, 기타 등등 ...
- String temp;
- TimeThread timeThread; // 시간재는 스레딩
- TextView mBackText; // 디버깅 텍스트뷰
- int limitTime;
- /** Called when the activity is first created. */
- public void onAccuracyChanged(Sensor arg0, int arg1) { }
- // 실험용 쓰레드가 초단위로 데이터를 보냄.
- Handler timeHandler = new Handler() {
- public void handleMessage(Message msg)
- {
- mBackText.setText("경과시간 : " + msg.arg1); // 텍스트뷰 쳐묵쳐묵
- if(msg.arg1 <= 50) // 시간이 0초가 되면.
- {
- Intent intent = new Intent(GameStart.this, GameResult.class); // 게임 리절트로 넘어간다.
- startActivity(intent);
- //finish();
- }
- }
- };
- ...
- }
아래는 타이머 쓰레드를 구현해둔것 입니다.
- {
- boolean gamePauseControl = false; // UI쓰레드(메인쓰레드)가 일시중단을 요청하면 true가 됨.
- int limitTime = 10; // 게임의 제한시간.
- int currentGameTime = 60; // 실제 카운팅되는 상대시간. 초단위로 계산되며,
- // if(currentGameTime == limitTime) 게임끗();
- Handler timeHandler; // 현재시간을 초단위로 UI쓰레드에게 넘김.
- // Handler gameHandler; // 게임진행여부를 UI쓰레드에게서 넘겨받음.
- TimeThread(Handler handler)
- {
- timeHandler = handler;
- }
- public void run()
- {
- while(true)
- {
- currentGameTime--;
- Message msg = Message.obtain(timeHandler, 0, currentGameTime, 0);
- timeHandler.sendMessage(msg);
- try
- {
- }
- {
- e.printStackTrace();
- }
- }
- }
- }
현재 팀원들이 집에 가버려서, 실 개발장비가 없어, 에뮬레이터로 구동해보고 있습니다.
일정 시간이 되면(if(msg.arg1 <= 50)), GameResult 액티비티가 무한 호출이 되고, GameStart액티비티는 죽지 않고, 계속 GameResult를 무한 호출하고 있습니다...
제가 생각해도, UI쓰레드의 17~29행은 문제가 있는 코드라는것을 인지는 하고 있는데 ...
저걸 어떤식으로 구현해야할지 모르겠습니다. 정말 답답한 일이죠...
액티비티의 생명주기를 공부해봐도, 어느 코드에다가,
Intent intent = new Intent(GameStart.this, GameResult.class); // 게임 리절트로 넘어간다.
startActivity(intent);
를 넣어줘야할지 당최 감이 오지 않네요 ...
Win API에서는, WndProc 콜백함수가 있어서, 상당히 코드제어가 직감적으로 감이 왔는데 ...
안드로이드에서, 게임을 제어하는 코드는 대체 어디에 넣어야할까요 ...
또한, finish(); 메서드를 삽입했는데, 왜 GameStart 액티비티가 죽지 않고, 쓰레드가 계속 돌아가는지도 답답합니다...
부디, 개발자 선배님들께서는 급하게 안드로이드 벼락치기를 하고있는 초심자를 가여이 여기셔서 속좀 시원하게 조언해주세요.
이것으로 2시간 넘게 책과 구글링으로 싸움을 하고 있는데 ... 도무지 답답한게 풀리지가 않네요.




핸들러에 있는 sendEmptyMessageAtTime(1, 50000) 이거 사용하면 스레드도 필요없고 걍 될거같네요..
근데 핸들러 주석에는 0초가되면인데 if문은 왜저러나요;;;;