cocos2d-x 공부용2014. 9. 11. 18:29

원글 출처 : 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;
}

이제 빌드 시도해서 성공하면, 기기로 실행해봅니다.



터치하는대로 코인이 사라지면 성공입니다.


------------------------------------------------------------------------------------------------

자연스럽게 쓰다 보면 말투가 왔다갔다 하네요.

오늘은 일이 있어서 이것밖에 못했습니다.


Posted by 아이시네프