본문 바로가기

게임개발팁

cocos2d-X 게임 만들기 4편


cocos2d-x 게임 만들기 3편에 이어서 4편에서는 표창을 추가해 보겠습니다. 화면을 터치하면 게임 주인공인 닌자가 표창을 던집니다.

1. 터치가 가능하게 레이어 수정하기
터치 가능한 레이어를 만들기 위해서는 아래의 메서드를 사용하면 됩니다.

  • setIsTouchEnabled(true);


GameScene클래스의 init메서드를 아래와 같이 수정합니다.

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