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

Surfaceview에 대해 질문드립니다..

0 추천

surfaceview를 이용하여 게임 앱을 제작해보고 있습니다.

퍼즐류의 게임으로 한 스테이지를 플레이중에 막힘이 생기거나 잘못했을경우 리셋버튼을 눌러서 다시 시도하는 기능을 추가하려고 합니다.

플레이어가 리셋버튼을 누르는 순간 surfaceview의 그리기를 잠시 멈추고, 해당 스테이지의 정보(리셋되는 퍼즐의 위치등)의 값들을 다시 불러온 뒤에 surfaceview의 그리기를 시작해야 된다는 생각에

run 함수 안에 if문으로 boolean 변수하나를 줘서 잠시동안 그리기를 멈출려고 했으나, if문 안에 dodraw가 실행이 되고 다 돌아가기전에 reset이 되면 튕기는것 같습니다.

그렇다고해서 스레드 자체를 지웠다가 다시 만들면 화면이 깜박이기 때문에 이상해 보이는데 좋은 방법이 없을까요??

 

대략적인 코드는 아래와 같습니다.

 

class ImageThread extends Thread {

    public static boolean isRun=true;

    }

...

public void dodraw(){

...

}

public void run() {

        while(Running) {

           if(isRun) doDraw();

        }

    }

}

 

class GamePage extends AppCompatActivity{

...

private View.OnClickListener ResetListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            isRun= false;

             ....
            isRun=true;
        }
    };

}

 

 

IU (260 포인트) 님이 2020년 1월 8일 질문

1개의 답변

0 추천

handler가 queue역활을 하니,  ImageThread 를 사용하는 것 대신 Handler에 draw 이벤트가 들어올 경우 그리는 방식으로 변경하고, reset 이벤트가 들어올 경우 reset을 수행 하는 방식으로 변경 하시는게 좋을 듯 합니다. 

 

말로 쓰니 어렵네요..  reset 버튼이 눌렀을 때 handler.sendEmptyMessage(MSG_RESET);  하는 형식입니다.

핸들러는 아래와 비슷하게 구현 하시면 되실 듯 하고요.

 

private Handler handler = new Handler() {

@Override

public void handleMessage(Message msg) {

    switch (msg.what) {

        case MSG_DROW: {

    doDraw();

    if(isRun) handler.sendEmptyMessage(MSG_DROW);

}

break;

case MSG_RESET: {

    doReset();

}

break;

    }

}

익명사용자 님이 2020년 1월 29일 답변
다른 방법으로 해결했는데 이 방법을 보니 다시 바꿔야 되나 생각이 드네요 ㅠㅠ
...