원글 출처 : http://horns.tistory.com/8
이전 터치관련 포스팅에서 언급했던 문제를 해결하였으므로 계속 작성합니다.
터치 문제가 아니라 제가 소스 한 줄을 빼먹어서 발생한 문제였습니다ㅠ
------------------------------------------------------------------------------------------------
-5- Touch
1. 터치 함수 추가
HelloWorldScene.h
void initGameCoin(void); GameCoin* createGameCoin(const Point &pos, int type, int state); virtual bool onTouchBegan(Touch* touch, Event* event); virtual void onTouchMoved(Touch* touch, Event* event); virtual void onTouchEnded(Touch* touch, Event* event); int checkPushGameCoin(Point &touchPos); };
이상태로 빌드하지 마시고 반드시 HelloWoridScene.cpp에 다음과 같이 작성한 후 빌드해주세요.
오버라이드 함수라 헤더파일에만 추가하고 빌드하면 반드시 에러가 납니다.
HelloWorldScene.cpp
우선 init()함수 안에 아래 내용을 추가합니다.
bool HelloWorld::init() { ////////////////////////////// // 1. super init first if (!Layer::init()) { return false; } _screenSize = Director::sharedDirector()->getWinSize(); this->setTouchEnabled(true); //디스패처. 리스너와 오브젝트를 연결해주는 역할 EventDispatcher* dispatcher = Director::getInstance()->getEventDispatcher(); //터치 위치를 알려주는 리스너. 단일 터치. //바로 만들어쓰는 식별자는 auto를 사용한다. auto positionListener = EventListenerTouchOneByOne::create(); //zOrder에 따라 밑에 깔린애도 동작할지 아닐지를 결정한다. true면 상위 리스너만 동작한다. positionListener->setSwallowTouches(true); //콜백 함수 대입 positionListener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this); //디스패처를 이용해 객체와 리스너를 이어준다. 화면 전체를 터치할 수 있게 만들어야 하므로 객체는 this dispatcher->addEventListenerWithSceneGraphPriority(positionListener, this); createGameAction(); createGameScene(); return true; }
그리고 하단부에 아래와 같이 Touch관련 함수를 작성합니다.
bool HelloWorld::onTouchBegan(Touch* touch, Event* event) { //getCurrentTarget은 Node를 반환한다. 이것이 터치한 오브젝트가 된다. auto target = event->getCurrentTarget(); Point location = target->convertToNodeSpace(touch->getLocation()); } void HelloWorld::onTouchMoved(Touch* touch, Event* event) { auto target = event->getCurrentTarget(); Point location = target->convertToNodeSpace(touch->getLocation()); } void HelloWorld::onTouchEnded(Touch* touch, Event* event) { auto target = event->getCurrentTarget(); Point location = target->convertToNodeSpace(touch->getLocation()); }
여기까지 빌드가 무사히 되셨다면 좋겠습니다.
2. 코인 동작
이제 터치해서 코인이 반응하도록 합니다.
HelloWorldScene.cpp
onTouchBegan 안에 다음과 같은 내용을 추가합니다.
bool HelloWorld::onTouchBegan(Touch* touch, Event* event) { //getCurrentTarget은 Node를 반환한다. 이것이 터치한 오브젝트가 된다. auto target = event->getCurrentTarget(); Point location = target->convertToNodeSpace(touch->getLocation()); checkPushGameCoin(location); return true; }
그런 다음, 아래와 같이 함수를 추가합니다.
int HelloWorld::checkPushGameCoin(Point &touchPos) { int index; GameCoin *tmpCoin; for (index = 0; index < _gameCoins->count(); index++) { tmpCoin = (GameCoin*) _gameCoins->objectAtIndex(index); if (tmpCoin->boundingBox().containsPoint(touchPos)) { if (tmpCoin->isVisible() == true) { tmpCoin->setVisible(false); } else { tmpCoin->setVisible(true); } return index; } } return -1; }
이제 빌드 시도해서 성공하면, 기기로 실행해봅니다.
터치하는대로 코인이 사라지면 성공입니다.
------------------------------------------------------------------------------------------------
자연스럽게 쓰다 보면 말투가 왔다갔다 하네요.
오늘은 일이 있어서 이것밖에 못했습니다.