플밍

cocos2d-x 3.0 터치이벤트 정리 본문

프로그래밍/cocos2d-x

cocos2d-x 3.0 터치이벤트 정리

너구리안주 2014. 5. 13. 17:20

cocos2d-x3.0에서는 터치이벤트 다루는 방법이 2.X 버전과 많이 달라졌다.

setTouchEnabled 함수가 deprecate 되고 EventListener 를 생성해서 dispatcher 에 등록하는 방법으로 바뀌었다.

인터페이스와 같은 사용방법이므로 모든 메소드를 구현해 주어야 한다.

#ads_1


1. 싱글터치 (타겟터치)

<helloworld.h>


class HelloWorld: public cocos2d::LayerColor{
	//...
	
	virtual bool onTouchBegan(Touch* touch, Event* unused_event);
	virtual void onTouchMoved(Touch* touch, Event* unused_event);
	virtual void onTouchCancelled(Touch* touch, Event* unused_event);
	virtual void onTouchEnded(Touch* touch, Event *unused_event);
	
	//...
};
<helloworld.cpp>
void HelloWorld::onEnter(){
	//...
	
	auto listener = EventListenerTouchOneByOne::create();

	// 핸들링된 터치 이벤트를 터치 이벤트 array에서 지우겠다는 의미이다.
	 listener->setSwallowTouches(true);

	 listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this);
	 listener->onTouchMoved = CC_CALLBACK_2(HelloWorld::onTouchMoved, this);
	 listener->onTouchCancelled = CC_CALLBACK_2(HelloWorld::onTouchCancelled, this);
	 listener->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded, this);

	// 터치리스너의 우선순위를 (노드가) 화면에 그려진 순서대로 한다.
	 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);

	//...

}

bool HelloWorld::onTouchBegan(Touch* touch, Event* unused_event){

	Point location = touch->getLocation();
	//.....
	return true;

}

void HelloWorld::onTouchMoved(Touch* touch, Event* unused_event){}

void HelloWorld::onTouchCancelled(Touch* touch, Event* unused_event){}

void HelloWorld::onTouchEnded(Touch* touch, Event* unused_event){}

#ads_2



2. 멀티터치 (스탠다드 터치)

<helloworld.h>
class HelloWorld: public cocos2d::LayerColor{
	...
	
	virtual bool onTouchesBegan(const std::vector<touch*>&touches, Event* unused_event);
	virtual void onTouchesMoved(const std::vector<touch*>&touches, Event* unused_event);
	virtual void onTouchesCancelled(const std::vector<touch*>&touches, Event* unused_event);
	virtual void onTouchesEnded(const std::vector<touch*>&touches, Event *unused_event);
	
	...
};



<helloworld.cpp>

void HelloWorld::onEnter(){
	//...

	auto listener = EventListenerTouchAllAtOnce::create();
	//listener->setSwallowTouches(true); //멀티터치이기 때문에 삼키면 안된다

	listener->onTouchesBegan = CC_CALLBACK_2(HelloWorld::onTouchesBegan, this);
	listener->onTouchesMoved = CC_CALLBACK_2(HelloWorld::onTouchesMoved, this);
	listener->onTouchesCancelled = CC_CALLBACK_2(HelloWorld::onTouchesCancelled, this);
	listener->onTouchesEnded = CC_CALLBACK_2(HelloWorld::onTouchesEnded, this);
	_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);

	//...

}

void HelloWorld::onTouchesBegan(const std::vector<touch*>&touches, Event* unused_event){

	//...

	for (auto iter = touches.begin(); iter != touches.end(); iter++){
	  Point location = (*iter)->getLocation();
	  addNewSpriteAtPosition(location);
	}

	//...

}

void HelloWorld::onTouchesMoved(const std::vector<touch*>&touches, Event* unused_event){}

void HelloWorld::onTouchesCancelled(const std::vector<touch*>&touches, Event* unused_event){}

void HelloWorld::onTouchesEnded(const std::vector<touch*>&touches, Event* unused_event){}

#ads_3

Comments