Software Development/Tizen

[TIZEN]14. 타이젠_간단한게임 만들기7_게임기능구현

huiyu 2015. 12. 27. 12:15

9. 게임 기능부분 추가

이제 게임의 어느정도 기능이 구현이 되어져 있습니다.

이제 조금더 가다듬어 완성도를 높여보도록 하겠습니다.


[추가내용]

- state를 추가하여 상태 관리

- 사용자 입력과 답안 확인->score 반영

- O/X 확인


1. State 기능 추가

게임에서 아래와같이 state가 나뉘어서 관리를 하여야 합니다.

 - quest : 처음 문제가 제시될 때(이 때는 터치가 되어서 안됨)

 - answer : 사용자가 답안을 입력할 때


아래와 같이 변수를 추가합니다.

1
2
3
4
5
6
7
enum{
    state_wait,
    state_quest,
    state_answer,
};
 
int state_now;
cs


다음으로 게임 시작 시 문제가 제시 되므로, app_create()함수에서 아래와 같이 설정합니다.

1
state_now = state_quest;
cs


문제가 제시될 때는 터치를 막아야 하므로, 사각형을 터치할 때 호출되는 함수 clicked_rect()에 아래 부분을 추가합니다.

1
if(state_now==state_quest) return;
cs


문제제시가 끝난 다음, 사용자의 입력을 받을 수 있도록 state_now를 state_answer로 변경합니다. 

timer_quest()함수에 문제제시가 끝난 후 ECORE_CALLBACK_CANCEL을 반환하기전 아래와 같이 설정합니다.

1
2
3
idx = 0;//idx초기화진행
state_now=state_answer;
return ECORE_CALLBACK_CANCEL;
cs



-이렇게 되면, 처음 문제가 나올 때와 사용자가 입력을 할 때가 구분이 되었습니다. state_wait같은 경우 게임이 끝난 후 대기할 때 상태로 설정을 하면 됩니다.


2. 사용자 답안 확인

이제 만들어진 음계와 사용자의 입력값이 맞는지 확인해보도록 하겠습니다. 

답안을 확인할 인트형 배열, 점수를 기록할 인트형 변수를 설정합니다.

1
2
int answer[5];
int totalScore;
cs


click_rect()함수에 터치를 answer배열에 기록합니다.

1
answer[idx++= num;
cs


이어서, 5개의 입력이 다되었을 때 정답을 확인하는 부분과, 정답 시 O이미지 표시 후 score반영합니다. x시 게임을 종료합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
if(idx>=5)
{
    dlog_print(DLOG_INFO, "MY_LOG""5개완료");
    bool isSuccess = true;
    for(int i=0; i<5; i++)
    {
        if(quest[i]!=answer[i])
        {
            isSuccess = false;
            break;
        }
    }
 
    if(isSuccess)
    {
        evas_object_show(ad->img_o);//미리 이미지를 추가 해두세요
        state_now = state_quest;
        dlog_print(DLOG_INFO, "MY_LOG""성공");
        totalScore+=100;
        setQuest();
        ecore_timer_add(1, timer_quest, ad);
 
        char score[100];
        sprintf(score, "<align=center><font font_size=70>%d</font></align>", totalScore);
        elm_object_text_set(ad->score, score);
    }
    else
    {
 
        evas_object_show(ad->img_x);//미리 x이미지를 추가해두세요
        state_now = state_wait;
        dlog_print(DLOG_INFO, "MY_LOG""실패");
    }
 
}
cs


문제가 다시 시작되면, 화면에 보여줬던 O 이미지를 지우기 위해 timer_quest()함수에 아래와 같이 추가합니다.

1
evas_object_hide(ad->img_o);
cs



* 화면 색 및 배치 버튼 등을 변경해 보았습니다.



지금까지 완성된 모습입니다.



728x90