본문 바로가기
cocos2d-x

[cocos2d-x]#7 Event들을 처리해보자.

by chunma1126 2025. 1. 26.

 

우리는 지난시간에 Cocos2dx에서 지원해주는 다양한 Node 들을 알아봤다.

이번시간에는 Cocos2dx에서 인풋 이벤트들을 어떻게 처리 하는지 알아보도록 하겠다.

 

게임에서 가장 핵심적인 기능인 인풋을 Cocos2dx에서는 어떻게 처리 하는지 알아보자.

 

먼저 Cocos2dx에서 Event가 어떻게 작동 하는지 설명하도록 하겠다.

 

Event listeners

이벤트를 감지하고 처리하는 코드 덩어리다. 예를 들어, 사용자가 화면을 터치하거나 키보드를 누를 때 무슨 일이 일어날지 정의하는 곳이다.


Event dispatcher

"이벤트 발생!" 하고 알려주는 역할을 한다. 즉, 이벤트가 발생하면 관련된 리스너들에게 통보해 주는 거다.


Event objects

이벤트에 대한 세부 정보를 담고 있는 데이터 덩어리다. 예를 들어, 터치 이벤트라면 터치 좌표, 마우스 클릭 이벤트라면 버튼 번호 같은 게 포함되어 있다.

 

Cocos2dx 에서는 이런 구조로 이벤트를 처리해서 이벤트 발생 → 리스너가 반응 → 게임이 원하는 동작 수행이라는 흐름을 만들어낸다.

 

Event삼키기

이벤트가 특정 상황에서 멈추고 더이상 진행 되지 않았으면 싶을때가 있다.

Cocos2dx에서는 이를 Event를 삼킨다고 표현하고 아주 쉽게 이 기능을 사용할수 있다.

listener1->setSwallowTouches(true);

 

Listenr의 setSwallowTouches만 true로 바꿔주면 된다.

 

FixedPriority vs SceneGraphPriority

EventDispacher는 우선순위를 사용하여 이벤트처리 순서를 결정한다.

 

그리고 우선 순위를 결정하는 방식은 2가지가 있다.

 

FixedPriority는 우선순위 값을 기준으로 이벤트 리스너들이 처리되는 순서를 결정한다. 이 값은 정수형이며, 우선순위가 낮은 값이 먼저 이벤트를 처리하고, 높은 값은 그 이후에 처리된다.

 

예를들어 a리스너는 우선순위가 1이고 b리스너는 우선순위가 12면 a리스너 부터 실행된다.

 

SceneGraphPriority는 z-order 에 따라 이벤트 리스너의 우선순위를 결정한다. 여기서 z-order 값이 높은 노드에 연결된 리스너가 먼저 이벤트를 처리한다.

그러니까 화면상에서 앞에 그려질수록 이벤트가 먼저 실행된다.

 

KeyboardEvent & MouseEvent

cocos2dx에서는 총4가지의 내장 이벤트들이 있지만 현재 내가 개발하고 있는 환경이 PC이기 때문에 키보드와 마우스 이벤트를 알아보도록 하겠다.

auto listener1 = EventListenerKeyboard::create();
listener1->onKeyPressed = [=](EventKeyboard::KeyCode key, Event* event)
    {
        CCLOG("Down");
    };

listener1->onKeyReleased = [=](EventKeyboard::KeyCode key, Event* event)
    {
        CCLOG("Up");
    };

_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, this);

가장 먼저 KeyboardListenr객체를 만들고 거기에 키가 눌렸을때 키가 떼졌을때 이벤트 들을 등록할수 있다.

그리고 eventDispatcher에 현재 객체를 등록 해주면 된다.

 

_eventDispatcher는 내가 따로 만든게 아니라 Node객체가 원래 들고 있는 멤버 변수이다.

 

그리고 특정 키가 눌렸을때를 검사하고 싶다면 람다에 보이는 key를 사용하여 확인 할수 있다.

    listener1->onKeyPressed = [=](EventKeyboard::KeyCode key, Event* event)
        {
            if(key == EventKeyboard::KeyCode::KEY_SPACE)
                CCLOG("Spring!!");
        };

이렇게 검사할수 있다.

 

MouseEvent

언제나 그랬듯이 cocos2dx에서는 mouseEvent를 지원한다.

_mouseListener = EventListenerMouse::create();
_mouseListener->onMouseMove = CC_CALLBACK_1(MouseTest::onMouseMove, this);
_mouseListener->onMouseUp = CC_CALLBACK_1(MouseTest::onMouseUp, this);
_mouseListener->onMouseDown = CC_CALLBACK_1(MouseTest::onMouseDown, this);
_mouseListener->onMouseScroll = CC_CALLBACK_1(MouseTest::onMouseScroll, this);

 

mouseEvent는 마우스 버튼을 눌렀을때 ,땠을때 ,마우스를 움직였을때 ,스크롤 했을때 총 4가지로 이루어져 있다. 

 

Event를 MouseEvent로 변환해서 이벤트의 정보를 가져올수 있다.

 auto listener1 = EventListenerMouse::create();
 listener1->onMouseDown = [=](EventMouse* mouseEvent) 
     {
         mouseEvent->getCursorX();
     };

저렇게 캐스팅을 해서 가져오면 된다.

 

 

  • getCursorX(): 마우스 X 좌표
  • getCursorY(): 마우스 Y 좌표
  • getLocation(): 장면 좌표 (Vec2)
  • getLocationInView(): 뷰 좌표계에서 마우스 위치
  • getDelta(): 마우스 이동 변화량 (X, Y)
  • getMouseButton(): 마우스 버튼 상태 (LEFT, RIGHT, MIDDLE)

MouseEvent는 이러한 정보들 외에도 다른 정보들을 포함하고 있으니 개인적으로 알아보길 바란다.

 

 

오늘은 Cocos2dx에서 Event들을 어떻게 처리 하는지 알아봤다.

다음시간에는 cocos2dx의 물리와 충돌을 알아보도록 하겠다.

 

좋은 하루 보내랑