반응형

** 버튼입력 이벤트처리 **
copyrightⓒ Gamza

- Download #1 : InputSystem.zip (1.8 KB), Download : 119

게임은 이벤트처리방식으로 만들지 않는것이 일반적이라서 사용자의 입력을 직접 처리해 주어야 하죠. 특히나 버튼일 경우는 현재 키의 '눌림상태' 만으로 사용자가 한 행동 -아무일도 안하고 있는가,눌렀는가,떼었는가,누른채로 있는가- 을 알아내야 합니다.

이것에 대해서는 여러가지로 설명할수 있지만 제가 생각하기에 가장 이해하기 쉬운것은 진리표에의한 설명인거 같네요.

우선 사용자의 행동을 알아내기위해선 두가지 준비물이 필요합니다.
첫째, 이전 프레임의 키의 '눌림상태'
둘째, 현재 프레임의 키의 '눌림상태'

이것을 간단히 코딩해 본다면 다음처럼 되겠죠...

void main()
{
bool old_key;
bool cur_key;
while(1)
{
cur_key = get_current_keystate();
// A
old_key = cur_key;
}
}

자...이제 'A'라는 부분에 이르면 우리가 원하는 준비물이 각각 old_key와 cur_key에 들어가 있게되겠죠?
자 그럼, 사용자가 무슨짓(?)을 하고있는지 맞춰보도록 합시다.
old_key
cur_key
Event
key state
user action
0
0
None
not pressed
아무일도 안하고 있다
0
1
KeyDown
pressed
키를 눌렀다
1
0
KeyUp
not pressed
키를 떼었다
1
1
None
pressed
누른채로 가만히 있다
이제 상태를 알았으니 'A'라는 부분에 프로그램만 짜넣으면 됩니다.
가령 버튼을 누를때만 총알이 나가야 한다면...
if( !old_key && cur_key ) { 총알발사; }

표를 잘보시면 원리가 눈에 보이죠?
32개의 키의 상태를 하나의 변수에 넣어두면 이벤트 검사할때 좀더 유리하죠.
unsigned long KeyEvent32 = ( oldKeyState32 ^ curKeyState32 );
unsigned long KeyPressEvent32 = KeyEvent32 & curKeyState32;
unsigned long KeyReleaseEvent32 = KeyEvent32 & (~curKeyState32);
이런다음...
if( KeyReleaseEvent32 & 1 ) 첫번째 키가 떨어졌음.
다음처럼 32개의 키들의 이벤트발생 여부를 한방에 알아올수도 있습니다.
if( KeyEvent32 != 0 ) 뭔가 이벤트가 일어났다.
else 아무런 키 이벤트가 없다.

PS, 첨부된 파일은 지금 개발중인 시스템에서 사용될 입력시스템입니다. 참고가 되었으면 하는 마음에..

반응형

+ Recent posts