본문 바로가기

Cocos2d-x

7-2. 키보드(keyboard) - 중복키 입력

· cocos2d에서는 중복키 입력에 대해서 꽤 불친절합니다.

// 시도해봤자 안되는 것들 입니다.. 같은 전철을 밟지마세요...ㅠ
if(GetAsyncKeyState('A') && GetAsyncKeyState('D')) {}

bool A_keyPressed = true;
bool D_keyPressed = true;

if(A_keyPressed && D_keyPressed) {}

// switch문 안에서의 이중 case문 등등

 

· 여러가지 시도를 해봤지만 찾아낸 방법은 비트연산자입니다.

· 비트연산자에서 사용할 연산자는 복합비트연산자인 |= 와 ^=을 사용해야합니다.

· 간단하게 설명하자면 |=은 ON의 기능을, ^=은 OFF의 기능이라고 보시면 됩니다.

· 비트연산자의 플래그를 구글링해보시면 구체적인 이해가 쉽습니다.

 

· 기초 키보드를 선언 및 초기화한 상태에서, 헤더에 int형 변수 keyValue를 선언해줍니다.

· 앞서 다루었던 onKeyPressed와 onKeyReleased 콜백함수들 입니다.

void Keyboard::KeyPressed(EventKeyboard::KeyCode keyCode, Event * event)
{
	switch (keyCode)
	{
	case EventKeyboard::KeyCode::KEY_W:
	// 키보드 W를 눌렀을 때, 1에 해당하는 비트값을 keyValue에 할당한다.
	keyValue |= 1;
	
    // W키를 눌렀을 때, keyValue값이 1이라면
	if (keyValue == 1)
	{
	// 게임을 제작할 때 사용한 위로 쳐다보는 애니메이션 함수입니다.
    // 위로 쳐다보는 애니메이션 함수를 실행해라.
	lookingUp();
	}
    
    break;
    
    case EventKeyboard::KeyCode::KEY_D:
    // 키보드 D가 눌렀을 때, 8에 해당하는 비트값을 keyValue에 할당한다.
	keyValue |= 8;
	
	if (keyValue == 8)
	{
       	// 캐릭터가 오른쪽으로 움직이는 애니메이션 함수
		Character_rightRunning();
	}
    
    break;
}

이런식으로 W에는 비트 1에 해당하는 값을, D에는 비트 8에 해당하는 값을 ON해줍니다.

WD가 눌렀을 때는 어떻게 해야할까요?

간단하게 keyValue값이 9 일때 라고 if문을 넣어주시면 됩니다.

if (keyValue == 9)
{
	lookingUp_rightRunning()
}

 

누르던 키가 떼졌을 때는 ^=을 통해 OFF해줍니다.

void Keyboard::KeyReleased(EventKeyboard::KeyCode keyCode, Event * event)
{
	switch (keyCode)
	{
	case EventKeyboard::KeyCode::KEY_W:
    // W키를 뗐을 때, keyValue값에 할당되어 있는 값을 OFF 해줍니다.
	keyValue ^= 1;
    
    // W키를 뗐을 때, keyValue값이 0이라면 Idle()함수를 액션.
	if (keyValue == 0)
	{
		Idle();
	}
        
    break;
    }
    
    case EventKeyboard::KeyCode::KEY_D:
	keyValue ^= 8;

	if (keyValue == 0)
	{
    	Idle();
	}
   	
    break;
}

 

이런식으로 원하시는 키에 비트값을 할당/비할당 해주시면, 간단하게 키보드의 중복입력이 가능합니다.

'Cocos2d-x' 카테고리의 다른 글

7. 키보드(Keyboard)  (0) 2021.08.28
6. 애니메이션(Animation)  (0) 2021.08.28
5. 스케줄(schedule)  (0) 2021.08.18
4. 액션(Action)  (0) 2021.08.17
3. Menu  (0) 2021.08.07