DX라이브러리2014. 12. 23. 16:06

2.9 키 입력


키 입력 여부가 관련된 함수는 있지만 키가 얼마나 오랫동안 눌려 있는지 감수하는 함수는 없다. 때문에 이부분은 직접 코딩하여 실현해야 한다. 아래의 그림과 같이 게임의 메뉴 선택시 방향키를 눌러 한개씩 이동해야 하는 경우에 이와 같은 처리를 하게 된다.



만약 다음과 같은 예제를 통하여 구현하면


while(1){

  if(  방향키 "하"가 입력되었다. ){

    선택항목에서 아래로 한칸 내린다.;

  }

}


while문은 1초에 60번 동작하기 때문에 엄청난 속도(1초에 60번의 속도)로 메뉴 이동을 하게 된다. 잠깐만 눌렀다고 하더라도 자신이 원하는 메뉴를 선택하기가 매우 힘들어진다.


다음 예제를 통하여 확인 해보도록 하자.


#include <DxLib.h>


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

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


        int x=0;


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


                DrawFormatString( x, 0, GetColor(255,255,255), "?!" );


                if( CheckHitKey(KEY_INPUT_RIGHT) != 0 ){

                        x = x + 50;

                }


        }


        DxLib_End();

        return 0;

}


오른쪽 방향키를 누르게 되면 "?!"문자가 오른쪽으로 움직이는데 한칸씩이 아니라 매우 빠른 속도로 움직이는것을 볼 수 있다. 그렇다면 입력을 받은 시간만큼이 아니라 입력 받은 순간을 입력받 고서 1프레임 째로 한정하여 처리하면 되겠지만 DX라이브러리에서 제공하는 기본 함수만으로는 이부분이 불가능하다. 때문에 이 함수를 만들어보도록 한다. 먼저 키 입력 상태를 감지하는 GetHitKeyStateAll함수에 대해 알아본다. 레퍼런스는 여기를 확인.


선언

 int GetHitKeyStateAll( char *KeyStateBuf ) ;

기능

 키보드의 모든 키 입력 상태를 감지

인수

 char *KeyStateBuf : 키 입력 상태를 저장하는 포인터


지금까지 CheckHitKey함수를 사용했지만 많은 키를 확인하고 싶다면 위 함수를 사용한다. 인수에 반환하는 변수는 키 입력상태를 보존하기 위해 char형 배열로 선언한다. 키는 전부 256종류가 있으며 다음 예제처럼 사용하게 된다.


char key[256];

GetHitKeyStateAll( key );


함수를 호출하면 키코드에 따라 키의 입력 상태를 저장하게 된다. 각 키에 대응하는 키코드는 다음 표와 같다.



예를 들면 Z키를 감지하기 위해선


if( key[ KEY_INPUT_Z ] != 0 ){

}

가 된다.


그럼 위에서 언급했던 "몇 프레임이나 입력되었는가" 를 계산하는 함수를 만들어보자. 함수의 이름은 gpUpdateKey함수로 한다. 전역변수 int Key[256];을 선언하고 메인 함수에서 gpUpdateKey함수가 호출될 때 마다 모든 키의 입력 상태를 확인하여 입력된 키코드의 키프레임수를 가산한다.


#include <DxLib.h>


int Key[256]; // 키가 입력되는 프레임수를 저장


// 키 입력 상태를 갱신

int gpUpdateKey(){

        char tmpKey[256]; // 현재  키의 입력 상태를 저장

        GetHitKeyStateAll( tmpKey ); // 모든 키 입력 상태를 감지

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

                if( tmpKey[i] != 0 ){ // i번의 키코드에 대응 하는 키가 확인 되면

                        Key[i]++;     // 가산

                } else {              // 키가 눌려있지 않으면

                        Key[i] = 0;   // 0으로 변경

                }

        }

        return 0;

}


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

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


        int x=0;


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


                DrawFormatString( x, 100, GetColor(255,255,255), "?!" );


                if( Key[KEY_INPUT_RIGHT] == 1 ){

                        x = x + 50;

                } else if ( Key[KEY_INPUT_LEFT] == 1 ){

x = x - 50;

}


        }


        DxLib_End();

        return 0;


실행결과



위 예제의 gpUpdateKey함수에서 입력받은 키 코드에 대응하는 키의 입력 프레임을 가산하는 것이 가능하다. 즉, Key[키코드]에 입력된 수치가 입력하고 있는 프레임 수가 된다. 이 값이 1일 때만 처리하게 되면 입력된 순간에만 처리하는것이 가능하다. 또한 입력되고 있는 프레임의 수를 알 수 있기 때문에 얼마나 입력했나 하는 확인도 가능하다. 아래는 1초 이상 Z키를 눌렀을 때 문자가 표시되는 예제이다.


#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;

}


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

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


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


                if( Key[KEY_INPUT_Z] >= 60 ){ // 60프레임 이상 입력 햇다면

                DrawFormatString( 0, 0, GetColor(255,255,255), "?!" ); // 문자를 표시

        }


}


DxLib_End();

return 0;

}





Posted by 캡슐리어