DX라이브러리2014. 12. 24. 14:43

3.4 간단한 선택화면 (역방향 루프)


전 섹션에서는 아래방향으로의 루프를 재현해보았다. 그렇다면 반대방향으로 루프는 어떻게 해야 할까. 언뜻 생각하기에 SelectNum변수에 +1을 해서 아래방향으로 진행했으니 그 반대로 -1을 하면 되지 않을까 하는 생각이 들게 된다. 하지만 -1을 하게 되면 수열의 진행은 다음과 같아 진다.


0, -1, -2, -3, -4, 0, -1, -2, -3, -4........


우리가 원하는 루프는


0, 4, 3, 2, 1, 0, 4, 3, 2, 1.......


이다. 빼는 계산으로는 불가능하다는 것을 알았으니 더하는 계산으로 동일하게 구현해야 한다. 이 때에는 -1이 아니라 +4를 해주면 원하는 값을 얻을 수 있다. 나누는 수에서 -1한 수를 더하는 것으로 역루프가 성립된다. 전 섹션에서 사용했던 예제에 역루프를 추가해 보자


#include <DxLib.h>


int Key[256];


int gpUpdateKey(){

        char tmpKey[256];

        GetHitKeyStateAll( tmpKey );

        for( int i=0; i<256; i++ ){ 

                if( tmpKey[i] != 0 ){

                        Key[i]++;

                } else {

                        Key[i] = 0;

                }

        }

        return 0;

}


// 메뉴항목에 필요한 구조체 선언

typedef struct{

        int x, y;       // 좌표 변수

        char name[128]; // 항목 이름 변수

} MenuElement_t;


int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){

        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );


        // 메뉴항목은 5개를 만든다.

        MenuElement_t MenuElement[5]={

                {  80, 100, "새 게임" }, // 구조체 내부에 선언된 순서대로 각각의 값이 저장된다. (x,y,name 순서)

                { 100, 150, "보너스" },

                { 100, 200, "도움말" },

                { 100, 250, "설정" },

                { 100, 300, "게임종료" },

        };

        int SelectNum = 0; // 현재 선택 번호



        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){


                // 계산 구문

if( Key[ KEY_INPUT_DOWN ] == 1 ){ // 아래 방향키 처리


                        SelectNum = ( SelectNum + 1 ) % 5;

                }


if( Key[ KEY_INPUT_UP ] == 1 ){ // 위 방향키 처리


SelectNum = ( SelectNum + 4 ) % 5; // 역 루프 계산식

}


if( Key[ KEY_INPUT_DOWN ] == 1 || Key[ KEY_INPUT_UP ] == 1 ){ // 위 또는 아래 방향키가 입력

for( int i=0; i<5; i++ ){

if( i == SelectNum ){

MenuElement[i].x = 80;

} else {                      

MenuElement[i].x = 100;

}

}

}



                // 묘화 구문


                for( int i=0; i<5; i++ ){ // 메뉴 항목 묘화

                        DrawFormatString( MenuElement[i].x, MenuElement[i].y, GetColor(255,255,255), MenuElement[i].name );

                }


        }


        DxLib_End();

        return 0;

}


실행결과





Posted by 캡슐리어