마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

handler에 관한 질문입니다. 좀 도와주세요ㅠㅠ

0 추천
public class CardGameView extends View {
 Bitmap m_bgImage;
 Bitmap m_Card_Back, m_Card_Red, m_Card_Green, m_Card_Blue, m_TOUCH, m_end;
 SoundPool m_SoundPool;
 MediaPlayer m_Sound_BG;
 MediaPlayer m_effect1;
 MediaPlayer m_effect2;
 int m_Sound_ef1;
 int m_Sound_ef2;
 Handler mhandler;
 Handler chandler;
 int value = 0;
 
 
 Card m_Shuffle [][];
 
 public static final int STATE_READY = 0;
 public static final int STATE_GAME = 1;
 public static final int STATE_END = 2;
 private int m_state = STATE_READY; //초기화는 STATE READY부터
 
 private Card m_selected1 = null; //카드 짝맞출때 변수
 private Card m_selected2 = null;
 
 public CardGameView(Context context) {
  super(context);
  setFocusable(true);
  
  // TODO Auto-generated constructor stub
  m_bgImage = BitmapFactory.decodeResource(getResources(), R.drawable.background); //백그라운드 이미지 설정.
  m_Card_Back = BitmapFactory.decodeResource(getResources(), R.drawable.backside);
  m_Card_Red = BitmapFactory.decodeResource(getResources(), R.drawable.front_red);
  m_Card_Green = BitmapFactory.decodeResource(getResources(), R.drawable.front_green);
  m_Card_Blue = BitmapFactory.decodeResource(getResources(), R.drawable.front_blue);
  m_TOUCH = BitmapFactory.decodeResource(getResources(), R.drawable.touch);
  
  
  m_SoundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
  m_Sound_BG = MediaPlayer.create(context, R.raw.background);
  m_effect1 = MediaPlayer.create(context, R.raw.effect1);
  m_effect2 = MediaPlayer.create(context, R.raw.effect2);
  m_Sound_ef1 = m_SoundPool.load(context, R.raw.effect1, 1);
  m_Sound_ef2 = m_SoundPool.load(context, R.raw.effect2, 1);
  m_Sound_BG.start();
  
  
  m_Shuffle = new Card[3][2];
  SetCardShuffle();
  
  CardGameThread _thread = new CardGameThread(this); //이상태에서는 실행안됨.
  _thread.start(); 
  
  mhandler = new Handler();
  chandler = new Handler();
  
  chandler.sendEmptyMessage(0);
 }
 @Override
 protected void onDraw(Canvas canvas) {
  // TODO Auto-generated method stub
  //super.onDraw(canvas);
  canvas.drawBitmap(m_bgImage, 0, 0, null);
  
  for(int y=0; y<2; y++){
   for(int x=0; x<3; x++){
    if(m_Shuffle[x][y].m_state == Card.CARD_MATCHED|| m_Shuffle[x][y].m_state == Card.CARD_PLAYEROPEN || m_Shuffle[x][y].m_state == Card.CARD_SHOW ) {
     if(m_Shuffle[x][y].m_color == Card.IMG_RED)
      canvas.drawBitmap(m_Card_Red, 20+x*70, 150+y*110, null);// 해당하는 카드를 보여준다.
     else if(m_Shuffle[x][y].m_color == Card.IMG_BLUE)
      canvas.drawBitmap(m_Card_Blue, 20+x*70, 150+y*110, null);// 해당하는 카드를 보여준다.
     else if(m_Shuffle[x][y].m_color == Card.IMG_GREEN)
      canvas.drawBitmap(m_Card_Green, 20+x*70, 150+y*110, null);// 해당하는 카드를 보여준다.
     }
    else {// m_Shuffle[x][y].m_state == Card.CARD_CLOSE ||  m_Shuffle[x][y].m_state == Card.CARD_BEGIN
     canvas.drawBitmap(m_Card_Back, 20+x*70, 150+y*110, null);// 해당하는 카드를 보여준다.
    }
  }
 }
  if(m_Shuffle[0][0].m_state ==Card.CARD_BEGIN){ //첫번째 터치 들어올때만 보여지게 한다.
   //state를 바꾸거나 card의 상태를 살펴본다.
   canvas.drawBitmap(m_TOUCH, 20, 150, null);
  }
  if(m_Shuffle[0][0].m_state == STATE_END){
  canvas.drawBitmap(m_end, 20, 150, null);
  }
  
 }
 
 //start게임이 무엇인지 정의
  public void startGame() {
   m_Shuffle[0][0].m_state = Card.CARD_CLOSE; //현재 상태를 모두 card close로 변경.
   m_Shuffle[0][1].m_state = Card.CARD_CLOSE;
   m_Shuffle[1][0].m_state = Card.CARD_CLOSE;
   m_Shuffle[1][1].m_state = Card.CARD_CLOSE;
   m_Shuffle[2][0].m_state = Card.CARD_CLOSE;
   m_Shuffle[2][1].m_state = Card.CARD_CLOSE;
   
   invalidate();
  }
  
  public void showCard() {
   m_Shuffle[0][0].m_state = Card.CARD_SHOW; //현재 상태를 모두 card SHOW로 변경.
   m_Shuffle[0][1].m_state = Card.CARD_SHOW;
   m_Shuffle[1][0].m_state = Card.CARD_SHOW;
   m_Shuffle[1][1].m_state = Card.CARD_SHOW;
   m_Shuffle[2][0].m_state = Card.CARD_SHOW;
   m_Shuffle[2][1].m_state = Card.CARD_SHOW;
   
   invalidate();
  }
  
  @Override
  public boolean onTouchEvent(MotionEvent event) {
   // TODO Auto-generated method stub
   if(m_state == STATE_READY){
    showCard();
   
   mhandler.post(new Runnable() {
    @Override
    public void run() {
     // TODO Auto-generated method stub
    try{
     Thread.sleep(5000);
     }catch (InterruptedException e){};
      startGame();
    }
   });
   
    //startGame(); //다른곳에서 호출을 해 주어야 한다.타이머쪽에서 실행할 수 있도록.
   m_state = STATE_GAME; //카드를 시작한후에는 STATE_GAME으로 바꿔줌 터치만으로도 동작을함. 위치지정 필요 없음.
   } //STATE_READY이면 STARTGAME이다.
   //카드 show에서 카드 close로 바꿔야 한다.
   
   else if(m_state == STATE_GAME){
    int px = (int)event.getX(); //터치위치지정
    int py = (int)event.getY(); //터치위치지정
    for(int y=0 ; y<2 ; y++){
     for(int x=0 ; x<3 ; x++){
      Rect box_card = new Rect(20+x*70, 150+y*110, 20+x*70+80, 150+y*110+115);
      if(box_card.contains(px,py))
       if(m_Shuffle[x][y].m_state != Card.CARD_MATCHED){
        if(m_selected1 != null){
         m_selected2 = m_Shuffle[x][y];
         m_selected2.m_state = Card.CARD_PLAYEROPEN;
        }
        
        else if(m_selected1 == null){
         m_selected1 =  m_Shuffle[x][y];
         m_selected1.m_state = Card.CARD_PLAYEROPEN;
        }
       }
     }
    }
    
    chandler = new Handler(){
     public void handleMessage(Message msg){
      value++;
      chandler.sendEmptyMessageDelayed(0, 1000);
      
     }
    };    
   }
   
   else if(m_state == STATE_END){
    
   }
   invalidate();
   return super.onTouchEvent(event);
  }
  

이 소스에서 handler를 이용하여 타이머를 생성하고 ondraw를 통하여 화면에 게임을 시작되고 짝을 다 맞출때까지 시간을 나타나게 하고 싶습니다. 그리고 짝 맞추다가 틀린 갯수도 나타나게 하고 싶은데 어떻게 해야 할까요?? 몇시간을 붙잡고 있는데 해결이 안되네요... 도와주세요ㅠㅠ
 

익명사용자 님이 2013년 5월 3일 질문

1개의 답변

0 추천
handler랑.. thread사용하면 할수잇지않을까요..?
익명사용자 님이 2013년 5월 3일 답변
...