COCOS 2D-X 엔진의 이벤트 처리

마스터피스·2024년 3월 19일
0

COCOS2D-X

목록 보기
5/11
post-thumbnail

COCOS2D-X 엔진의 이벤트 처리

1.터치와 키보드 입력.

bool HelloWorld::init(){
    if(!Scene::init()) return false;

    // 터치 함수 
    auto touch = EventListenerTouchOneByOne::create();
    touch->onTouchBegan = std::bind(&HelloWorld::onTouchBegan, this, std::placeholders::_1, std::placeholders::_2);
    getEventDispatcher()->addEventListenerWithSceneGraphPriority(touch, this);

    //키보드 입력 함수
    auto keybd = EventListenerKeyboard::create();
    keybd->onKeyPressed = [=](EventKeyboard::KeyCode c, Event* e) -> void {
        if (c == EventKeyboard::KeyCode::KEY_SPACE) {
            CCLOG("Space Pressed!!");
        }
    };
    getEventDispatcher()->addEventListenerWithSceneGraphPriority(keybd, this);

    return true;
    
}

bool HelloWorld::onTouchBegan(Touch* t, Event* e){
    CCLOG("TOUCH");
    return true;
}
  • 정의를 모르겠다면 F12 눌러 함수의 정의 확인하기.
  • CALL 함수 : 내가 만든 호출 함수
  • CALLBACK 함수 : 내가 만든게 아닌 자동적으로 호출하게 되는 함수
  1. 메모리 관리 모델

cpp 파일

bool HelloWorld::init(){
    if(!Scene::init()) return false;
    
    
    dn = DrawNode::create();
    dn->drawSolidCircle(Vec2(1280/2, 720/2), 10, 0, 28, Color4F::WHITE);
    //addChild 가 없다면 에러 발생. 부모가 사라지기 때문
    addChild(dn);

    schedule(CC_SCHEDULE_SELECTOR(HelloWorld::logic));

    return true;
}

void HelloWorld::logic(float dt){
    dn->setPosition(dn->getPosition() + Vec2(100, 0)* dt);
}
// on "init" you need to initialize your instance
bool HelloWorld::init(){
    if(!Scene::init()) return false;
    
    
    dn = DrawNode::create();
    dn->drawSolidCircle(Vec2(1280/2, 720/2), 10, 0, 28, Color4F::WHITE);
    //retain()을 이용해 메모리에서 해제를 시키지 않는 방법이 있다.
    dn->retain();


    //addChild 가 없다면 에러 발생. 부모가 사라지기 때문
    //addChild(dn);

    schedule(CC_SCHEDULE_SELECTOR(HelloWorld::logic));
    schedule(CC_SCHEDULE_SELECTOR(HelloWorld::timerLogic));

    return true;
}

void HelloWorld::logic(float dt){
    dn->setPosition(dn->getPosition() + Vec2(100, 0)* dt);
}

// 부모가 없다면 3초후에 나타나는 이벤트
void HelloWorld::timerLogic(float dt){
    time += dt;
    if (time >= 3 && dn->getParent() == nullptr ) {
        addChild(dn);
    }
}

해더 파일

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"

using namespace cocos2d;

class HelloWorld : public Scene{
    float time = 0;
public:
    DrawNode* dn;
    static Scene* createScene();

    virtual bool init();

    void logic(float dt);

    void timerLogic(float dt);
    // implement the "static create()" method manually
    CREATE_FUNC(HelloWorld);
};

#endif // __HELLOWORLD_SCENE_H__
  1. 레퍼런스 활용.
    DOCS
    https://docs.cocos.com/cocos2d-x/manual/en/

API REFERENCE
https://docs.cocos2d-x.org/api-ref/index.html

v4.x C++ 버전 찾기

  1. EventListener

Cocos2d-x의 이벤트 핸들링은 EventListener라는 클래스를 이용하면 간단하게 작성할 수 있습니다. 또한 EventDispatcher를 이용해 해당 EventListener를 등록해주기만 하면 간단하게 끝납니다. 여기서 중요한 것은 EventListener를 등록할 때 함수파라미터를 직접 찾아가면서 등록할 수 있어야 한다는 것입니다. 이런 것들을 모두 외워가면서 개발을 하는 개발자는 없습니다.

  1. Schedule

Schedule도 하나의 이벤트라고 볼 수 있습니다. 게임 세계에서는 update나 schedule을 통해 어떤 함수가 일정 주기를 기준으로 지속적으로 반복되면서 실행되게 됩니다. 이 함수가 주기적으로 실행되면서 게임 세계를 업데이트하고 사용자 입력에 맞는 행동을 하게 됩니다.

  1. 사용자 이벤트 핸들링

사용자 이벤트 핸들링이란 사용자로부터 받는 터치, 키보드 입력을 받아 적당한 방법으로 처리하는 것을 의미합니다. Cocos2d-x에서는 기본적으로 Callback 방법으로 이벤트를 처리할 수 있습니다. Callback 이란 시스템이 자동으로 함수를 호출해주는 것을 의미합니다. 이 Callback을 잘 이해해야만 앞으로 개발을 할 때 많은 도움이 될 것입니다.

profile
코딩 일지

0개의 댓글