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; } |
실행결과
'DX라이브러리' 카테고리의 다른 글
3.6 sin함수를 이용한 매끄러운 이동 (0) | 2014.12.26 |
---|---|
3.5 sin 함수를 이용한 물체 이동 / 확대축소 (0) | 2014.12.24 |
3.3 간단한 선택화면 (0) | 2014.12.24 |
3.2 나눗셈 나머지를 이용한 루프 (0) | 2014.12.24 |
3.1 키 입력에 대응해서 캐릭터를 움직여보자 (0) | 2014.12.24 |