모바일 맞고 게임7-2(디스플레이 요소 추가 #2)
DevSource/맞고 2012. 12. 27. 22:18 |이번 시간에는 게임내에서 사용자에게 어떤 메시지를 전달하기 위한 다이얼로그들을 구현해 보겠습니다.
뭐, 메시지를 전달하기 위한 다이얼로그라고 해봤자 별건 아니구요,
쪽, 뻑, 따닥, 쓸 과 같은 메시지를 화면에 출력해 주는 그런 내용입니다. 이전시간과 전반적인 흐름은 같습니다.
먼저 순서대로 쪽 부터 구현을 해보도록 하지요.
☆ ☆ ☆ ☆ ☆ ☆ |
case 2: // 손에서 낸 카드와, 뒤집어 낸 카드 둘뿐이라면, /* 쪽! */ curViewState = State.GAME_SHOWMESSAGE; curMsgState = CyDialog.MSG_JJOK; repaints(); Sleep.wait(this, 300); curViewState = State.GAME_RUNNING; repaints(); // 쪽일때에는, 우선 두장 다 먹고, room.addPae(curTurn, room.getMonth(handCardIdx)[0]); room.addPae(curTurn, room.getMonth(handCardIdx)[1]); room.getMonth(handCardIdx)[0] = room.CARD_NULL; room.getMonth(handCardIdx)[1] = room.CARD_NULL; // 상대방의 피를 하나 가져온다. room.robPee(curTurn); repaints(); break; |
전체 함수를 모두 올리는건 지면상 오버헤드가 큰것 같아서 쪽 부분만을 따로 떼어 내었습니다.
예전의 소스와 별 다를 것이 없지만, 앞 부분에 몇가지 부분이 추가 되었습니다.
먼저, State 클래스에 GAME_SHOWMESSAGE 라는 상태 상수가 추가 되었지요.
curViewState가 GAME_SHOWMESSAGE 상태일때에는 어떤 메시지를 보여주고 있는 상태를 뜻합니다.
현재 보여주고 있는 메시지의 종류는 아래 보이는 curMsgState 라는 변수에 저장을 하고 관리합니다.
지금 이 상태에서는 CyDialog 클래스의 MSG_JJOK 이라는 상태 상수가 저장되었으므로,
현재 보여지는 메시지가 "쪽"과 관련된 메시지 라는 것을 알 수 있겠죠.
메시지를 일정 시간 보여주고 난 뒤에는 다시 게임으로 돌아와서, 화면을 다시 그려주면 되겠지요.
< 쪽이 발생했을때의 메시지 > |
다음으로 뻑일때의 메시지 출력을 구현해 보도록 하겠습니다.
☆ ☆ ☆ ☆ ☆ ☆ |
case 3: // 손에서 낸 카드와, 뒤집어 낸 카드와 원래 카드 한장이라면, room.incCntPuck(curTurn); // 뻑 횟수 +1. curViewState = State.GAME_SHOWMESSAGE; curMsgState = CyDialog.MSG_PPUCK; repaints(); Sleep.wait(this, 300); curViewState = State.GAME_RUNNING; repaints(); // 3번 뻑이라면, if(room.getCntPuck(curTurn) >= 3) { // 7점에 해당하는 금액을 상대방에게 받고, room.setPoint(curTurn, 7); // 플레이어 점수를 7점으로 세팅. // 게임 종료. curViewState = State.GAME_RESULT; repaints(); // 게임 끝. curViewState = State.GAME_RESULT; repaints(); return; } break; |
뻑 역시 마찬가지입니다.
curViewState를 GAME_SHOWMESSAGE로 변경하고,
curMsgState에 MSG_PPUCK이 저장되었으므로, "뻑" 메시지와 관련된 이미지를 출력해 줍니다.
뻑이 나면, 강렬한 응가 이미지로 뻑이 났다는걸 플레이어가 좀더 쉽게 인식할 수 있게 해주지요^^
< 뻑이 났음을 알려주는 메시지 > |
다음 따닥 부분을 보도록 하죠.
☆ ☆ ☆ ☆ ☆ ☆ |
else { /* 카드가 슬롯에 가득 차 있다면, 따닥! */ if(i == 3) { /* 따닥! */ curViewState = State.GAME_SHOWMESSAGE; curMsgState = CyDialog.MSG_DDADAK; repaints(); Sleep.wait(this, 300); curViewState = State.GAME_RUNNING; repaints(); // 모두 먹고, for(j=0; j<4; j++) { room.addPae(curTurn, room.getMonth(handCardIdx)[j]); room.getMonth(handCardIdx)[j] = room.CARD_NULL; } // 상대방의 피를 하나 가져온다. room.robPee(curTurn); } } |
역시 마찬가지죠. curMsgState가 MSG_DDADAK으로 변경된것 뿐이군요.
< 따닥이 발생했을때의 메시지 > |
쓸이 발생했을때에는 처리해 줄 것이 조금 있죠.
쓸이라는건, 플레이어가 패를 낸 후, 먹을 수있는 패를 다 먹었을때, 바닥에 패가 한장도 없다면, 쓸이죠.
따라서, 턴이 변경되기 바로 전에, 쓸을 체크 하는 것이 좋겠네요.
좀더 편하게 작업하기 위해서, 턴을 변경 하는 것을 따로 함수로 만들었습니다.
/** * 턴을 변경한다. */ private void changeTurn() { // 쓸 체크. if(checkSseul() == true) { curViewState = State.GAME_SHOWMESSAGE; curMsgState = CyDialog.MSG_SSEUL; repaints(); Sleep.wait(this, 300); curViewState = State.GAME_RUNNING; repaints(); } // 턴 변경. curTurn = (curTurn==User.PLAYER)? User.COMPUTER : User.PLAYER; } |
단순히 턴을 변경하는 것이 아니라, 턴을 변경 하기 전에 checkSseul() 함수를 이용해서 쓸을 체크한후,
쓸이라면, 쓸 메시지를 일정시간 보여준 후, 턴을 변경해 줍니다.
쓸을 체크 하는 함수는 다음과 같습니다.
/** * 쓸의 여부 체크. */ private boolean checkSseul() { for(byte i=0; i<12; i++) { // 한군데의 월이라도 카드가 있다면, 쓸이 아님. if(room.getMonth(i)[0] != room.CARD_NULL) return false; } // 쓸. return true; } |
12개의 월을 루프를 돌면서 검사를 해서, 카드가 없다면, true를 리턴, 있다면 false를 리턴합니다.
카드가 없어야 쓸이니, true가 리턴이 되면 쓸이라는 의미가 되겠죠.
그리고 앞 시간의 결과 메시지를 출력하는 부분에서 그냥 단순히 결과 메시지만을 출력하고 끝났었죠.
그러나, 그렇게 되면, 아무런 키 입력도 먹지를 않기 때문에, 플레이어는 다운이라도 된줄 알겠죠.
결과 창에서, 확인키를 눌렀을 때 보여줄 메뉴 상자를 하나 더 추가해줍니다.
이 메시지 상자는 게임이 끝난 후, 게임을 계속 할 것인지를 묻는 의미가 강하기 때문에,
ContinueGame이라고 이름 지었습니다.
ContinueGame 메뉴 상자를 그려주는 함수는 drawContinueGame() 함수이며, 다음과 같습니다.
/** * 게임중의 메뉴화면을 그려준다. * @param g */ public void drawContinueGame(Graphics g) { if(preViewState == State.GAME_WAIT) drawWaitingGame(g); else drawRunningGame(g); dialog.drawBorder(g, CyDialog.CONTINUEGAME); } |
curViewState가 State.GAME_CONTINUEGAME 이라면, 이 ContinueGame 상자가 화면에 뜹니다.
그러나 이 ContinueGame 메뉴 상자는 게임이 끝났을 때에만 나오는 것이 아니라,?
게임 중간에도 취소 키나 메뉴 키를 누르면, 이 메뉴 상자가 뜨도록 했습니다.
그래서, ContinueGame 메뉴 상자 출력 전에는 현재 상태를 preViewState라는 곳에 저장을 해야 합니다.
또, preViewState가 GAME_WAIT인 상태에서 취소키를 누르면, 배경을 drawRunningGame()으로 그려주는것이아니라.
drawWaitingGame(g)으로 그려주어야 제대로 된 화면 위에 메뉴 상자가 출력이 되겠죠.
< ContinueGame 메뉴 상자 > |
drawContinueGame() 함수를 호출하면, 위와 같은 메뉴 상자가 출력 되겠죠.
그러나 출력은 되었다고 해도 키 입력은 아무런 처리도 안했기 때문에, 그냥 단순히 저 화면만 뜨겠죠?
이제 키 입력을 처리해 보도록 하겠습니다.
else if(curViewState == State.GAME_CONTINUEGAME) { if(numKey == 1) /* 계속 */ { if(preViewState == State.GAME_RESULT) { room.gameOver(); init(); curViewState = State.GAME_WAIT; } else curViewState = preViewState; } else if(numKey == 2) /* 나가기 */ { enterMainMenu(); } else if(numKey == 3) /* 겔러리로 가기 */ { gallery = new Gallery(midlet); gallery.savePreCanvas(this); midlet.setCurrentDisplay(gallery); gallery = null; System.gc(); } repaints(); } |
위 부분은 키입력을 받는 switch()문 안의 lsdefault: 블럭 안에 삽입된 내용입니다.
1을 누르면, 계속 이므로, GAME_RESULT에서 발생했다면, 게임을 다시 시작하고,
다른 곳에서 발생했다면, 사용자가 취소키나 메뉴키를 눌러서 불러낸 것이므로, 원래 상태로 돌아갑니다.
2번을 누르면 enterMainMenu() 함수를 통해서 메인 메뉴로 빠져나갈수 있도록 해주면 되겠죠.
아직 제대로 구현은 되어 있지 않지만, 게임에서 딴 게임머니로 겔러리에서 그림을 구입할수 있습니다.
3번을 누르면 겔러리 화면을 보여줍니다.
Midlet 클래스에서 gallery를 화면에 보여주는것과 같이 겔러리에서 돌아갈 현재 캔버스를 저장하고,
현재 display를 겔러리로 설정해 주면, 겔러리 화면이 화면에 그려지겠죠?
이걸로 어느정도 디스플레이 요소는 모두 추가를 시켜 주었네요.
'DevSource > 맞고' 카테고리의 다른 글
모바일 맞고 게임8-2(간단한 A.I. 첨가 #2 - 상황 선택 기능 구현) (0) | 2012.12.27 |
---|---|
모바일 맞고 게임8-1(간단한 A.I. 첨가 #1 - 기본 게임 진행 기능 구현) (0) | 2012.12.27 |
모바일 맞고 게임7-1(디스플레이 요소 추가 #1) (0) | 2012.12.27 |
모바일 맞고 게임6-3(추가 규칙과 벌칙, 그리고 결과 출력 구현 ) (0) | 2012.12.27 |
모바일 맞고 게임6-2(기본 게임 룰 및 점수 계산 구현) (0) | 2012.12.27 |