cocos2d-x 게임 만들기 3편에 이어서 4편에서는 표창을 추가해 보겠습니다. 화면을 터치하면 게임 주인공인 닌자가 표창을 던집니다.
1. 터치가 가능하게 레이어 수정하기
터치 가능한 레이어를 만들기 위해서는 아래의 메서드를 사용하면 됩니다.
- setIsTouchEnabled(true);
bool GameScene::init() { // CCLayerColor 의 initWithColor 초기자를 호출해 // 배경화면을 하얀색으로 변경한다. // 색상 설정은 ccc4(R, G, B, A) 매크로를 사용한다. if( !CCLayerColor::initWithColor(ccc4(255, 255, 255, 255)) ) { // 초기화에 실패하면 false를 반환합니다. return false; } //: 터치를 하면 총알을 쏘기 위해서 //: 레이어가 터치 입력을 받도록 설정합니다. this->setIsTouchEnabled(true); //: 플레이어 스프라이트를 화면에 추가합니다. this->setPlayerSprite(); //: 게임 로직을 만든다 this->schedule(schedule_selector(GameScene::gameLogic), 1.0); return true; }
2. 터치 핸들러 만들기
터치 가능한 레이어를 만들었으므로 터치업을 했을 때 주인공이 표창을 던질 수 있도록 터치핸들러를 만들어야 합니다. GameScene.h 와 GameScene.cpp 에 터치핸들러를 선언하고 구현합니다.
//: GameScene.h class GameScene : public cocos2d::CCLayerColor { ... //: 터치이벤트 핸들러를 선언합니다. void ccTouchesEnded(cocos2d::CCSet* touches, cocos2d::CCEvent* event); };
//: GameScene.cpp void GameScene::ccTouchesEnded(cocos2d::CCSet* touches, cocos2d::CCEvent* event) { //: 좌표를 가져올 임의 터치를 추출합니다. CCTouch *touch = (CCTouch*)(touches->anyObject()); CCPoint location = touch->locationInView(touch->view()); //: UI 좌표를 GL좌표로 변경합니다 location = CCDirector::sharedDirector()->convertToGL(location); //: 표창을 추가한다 this->addProjectileWithTouchLocation(location); }
이제 터치를 하면 터치좌표를 구하고, 구한 터치 좌표와 함께 addProjectileWithTouchLocation메서드를 호출합니다.
3. 표창 넣기
addProjectileWithTouchLocation메서드 내에서 표창을 추가하고 움직이게 하는 모든 로직이 들어있습니다. 이 메서드를 GameScene.h와 GameScene.cpp 파일에 선언하고 구현합니다.
//: GameScene.h class GameScene : public cocos2d::CCLayerColor { ... //: 표창을 추가합니다. void addProjectileWithTouchLocation(cocos2d::CCPoint location); //: 화면을 벗어난 표창을 제거합니다 void projectileMovedFinished(cocos2d::CCNode *node); };
코드에 대한 자세한 설명은 주석과 원문 튜토리얼을 참고하세요 :)
//: GameScene.cpp void GameScene::addProjectileWithTouchLocation(cocos2d::CCPoint location) { //: 표창의 처음 위치를 설정합니다. CCSize winSize = CCDirector::sharedDirector()->getWinSize(); CCSprite *projectile = CCSprite::spriteWithFile("Projectile.png", CCRectMake(0, 0, 20, 20)); projectile->setPosition(ccp(20, winSize.height/2)); //: 터치좌표와 표창간의 좌표 차이를 구합니다. int offX = location.x - projectile->getPosition().x; int offY = location.y - projectile->getPosition().y; //: 주인공 캐릭터 뒤쪽으로 던지는 표창은 무시합니다. if(offX <= 0) return; //: 표창의 그림을 자식으로 추가합니다. this->addChild(projectile); //: 표창이 도착할 목적지 위치를 계산합니다 //: 닮음삼각형의 비례식으로 쉽게 구할 수 있습니다. //: 관련 내용은 원문 튜토리얼을 참고하세요. int realX = winSize.width + (projectile->getContentSize().width/2); float ratio = (float)offY / (float)offX; int realY = (realX * ratio) + projectile->getPosition().y; CCPoint realDest = ccp(realX, realY); //: 표창이 도착점까지의 거리를 구합니다. //: 표창의 속도에 적용됩니다. int offRealX = realX - projectile->getPosition().x; int offRealY = realY - projectile->getPosition().y; float length = sqrtf((offRealX*offRealX)+(offRealY*offRealY)); float velocity = 480/1.0f; //: 1초당 480픽셀을 간다고 가정 float realMoveDuration = length/velocity; //: s = v*t 이므로 t = s/v; //: 표창을 움직인다 CCFiniteTimeAction *actions = CCSequence::actions( CCMoveTo::actionWithDuration(realMoveDuration, realDest), CCCallFuncN::actionWithTarget(this, callfuncN_selector(GameScene::projectileMovedFinished)), NULL ); projectile->runAction(actions); } void GameScene::projectileMovedFinished(cocos2d::CCNode *node) { //: 화면을 벗어난 표창을 제거한다 node->removeFromParentAndCleanup(true); }
4. 결과화면
아래는 아이폰과 안드로이드에서의 실행화면입니다. 터치와 동시에 화면을 캡쳐해야 해서 화면캡쳐가 조금 어려웠습니다. 코드를 컴파일하여 실행하면 안드로이드에서도 잘 나오니 참고하시길 바랍니다. :)
다음 편에서는 충돌처리를 구현해 보겠습니다^^
'게임개발팁' 카테고리의 다른 글
cocos2d-x Box2D 프로젝트 만들기 (10) | 2011.11.21 |
---|---|
cocos2d-X 게임 만들기 5편 (7) | 2011.11.18 |
cocos2d-X 게임 만들기 3편 (11) | 2011.10.13 |
cocos2d-X 게임 만들기 2편 (8) | 2011.10.13 |
cocos2d-X 게임 만들기 1편 (14) | 2011.10.12 |