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;
}
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__
API REFERENCE
https://docs.cocos2d-x.org/api-ref/index.html
v4.x C++ 버전 찾기
Cocos2d-x의 이벤트 핸들링은 EventListener라는 클래스를 이용하면 간단하게 작성할 수 있습니다. 또한 EventDispatcher를 이용해 해당 EventListener를 등록해주기만 하면 간단하게 끝납니다. 여기서 중요한 것은 EventListener를 등록할 때 함수파라미터를 직접 찾아가면서 등록할 수 있어야 한다는 것입니다. 이런 것들을 모두 외워가면서 개발을 하는 개발자는 없습니다.
Schedule도 하나의 이벤트라고 볼 수 있습니다. 게임 세계에서는 update나 schedule을 통해 어떤 함수가 일정 주기를 기준으로 지속적으로 반복되면서 실행되게 됩니다. 이 함수가 주기적으로 실행되면서 게임 세계를 업데이트하고 사용자 입력에 맞는 행동을 하게 됩니다.
사용자 이벤트 핸들링이란 사용자로부터 받는 터치, 키보드 입력을 받아 적당한 방법으로 처리하는 것을 의미합니다. Cocos2d-x에서는 기본적으로 Callback 방법으로 이벤트를 처리할 수 있습니다. Callback 이란 시스템이 자동으로 함수를 호출해주는 것을 의미합니다. 이 Callback을 잘 이해해야만 앞으로 개발을 할 때 많은 도움이 될 것입니다.