Bezier Action

º£Áö¾î °î¼±¿¡ ´ëÇÑ °ø½ÄÀº ¸ð¸£´õ¶óµµ ¾î¶»°Ô »ý°Ü ¸Ô¾ú´ÂÁö´Â ¾È´Ù°í °¡Á¤ÇÏ°í °­ÀǸ¦ ÁøÇàÇÑ´Ù.

ÄÚÄÚ½º2D-x º£Áö¾î °î¼±Àº 4°³ÀÇ Æ÷ÀÎÅÍ°¡ ÇÊ¿äÇÏ´Ù. ÀÚ·áÇüÀº ´ÙÀ½°ú °°´Ù.

ccBezierConfig
typedef struct _ccBezierConfig {
    CCPoint endPosition;
    CCPoint controlPoint_1;
    CCPoint controlPoint_2;
} ccBezierConfig;

4°³¶ó°í Çߴµ¥ 3°³¹Û¿¡ ¾ø´Ù. ³ª¸ÓÁö ÇÑ °³´Â ÇöÀç ½ºÇÁ¶óÀÌÆ®ÀÇ À§Ä¡ÀÌ´Ù. ½ÇÇàÈ­¸éÀ» ¸ÕÀú º¸ÀÚ.

1. º£Áö¾î, 2º£Áö¾î ¸®¹ö½º 3, ±âº»À§Ä¡·Î ¸®¼Â, 4, Á¡ÇÁ·Î ¸Þ´º¸¦ ¸¸µç´Ù.

¸Þ´º »ý¼º
bool HelloWorld::init()
{
    bool bRet = false;

    if( !CCLayerColor::initWithColor(ccc4(255, 255, 255, 255)))
    {
        return true;
    }

    bRet = true;

    m_debugDraw = DebugDraw::create();
    this->addChild(m_debugDraw);

    CCMenuItemFont::setFontSize(50);
    CCMenuItemFont::setFontName("fonts/Nanum Brush Script.ttf");

    CCMenuItemFont *pMenuItem1 = CCMenuItemFont::create(
        "Bezier",
        this,
        menu_selector(HelloWorld::DoClickTag));
    
    CCMenuItemFont *pMenuItem2 = CCMenuItemFont::create(
        "Reverse",
        this,
        menu_selector(HelloWorld::DoClickTag));

    CCMenuItemFont *pMenuItem3 = CCMenuItemFont::create(
        "Reset",
        this,
        menu_selector(HelloWorld::DoClickTag));

    CCMenuItemFont *pMenuItem4 = CCMenuItemFont::create(
        "Jump",
        this,
        menu_selector(HelloWorld::DoClickTag));

    CCMenu *pMenu = CCMenu::create(pMenuItem1, pMenuItem2, pMenuItem3, pMenuItem4, NULL);

    pMenu->alignItemsHorizontally();
    pMenu->setPosition(ccp(240, 300));

    pMenuItem1->setColor( ccc3( 255, 0, 0 ));
    pMenuItem2->setColor( ccc3( 0, 255, 0 ));
    pMenuItem3->setColor( ccc3( 0, 0, 255 ));
    pMenuItem4->setColor( ccc3( 0, 0, 0 ));

    pMenuItem1->setTag(1);
    pMenuItem2->setTag(2);
    pMenuItem3->setTag(3);
    pMenuItem4->setTag(4);
    this->addChild(pMenu);

    CCSprite* pWoman = CCSprite::create("Images/grossinis_sister1.png");
    pWoman->setPosition( ccp(30, 200));
    this->addChild( pWoman);

    mWoman = pWoman;
    return bRet;
}

º£Áö¾î Æ÷ÀÎÅ͸¦ ÁöÁ¤ÈÄ CCBezierBy·Î ¾×¼ÇÀ» »ý¼º ÈÄ ¾×¼ÇÀ» ½ÇÇàÇÑ´Ù.

º£Áö¾î ½ÇÇà
void HelloWorld::DoClickTag(CCObject* pSender)
{
    CCMenuItem *item = (CCMenuItem*)pSender;
    int n = item->getTag();

    if(n == 1)  //Bezier1
    {
        ccBezierConfig bezier;
        bezier.controlPoint_1 = ccp(150, 100);
        bezier.controlPoint_2 = ccp(250, -100);
        bezier.endPosition = ccp(350, 0);

        CCActionInterval *action = CCBezierBy::create(3, bezier);
        mWoman->runAction(action);
    }

    if(n == 2)  //Reverse
    {
        ccBezierConfig bezier;
        bezier.controlPoint_1 = ccp(150, 100);
        bezier.controlPoint_2 = ccp(250, -100);
        bezier.endPosition = ccp(350, 0);

        CCActionInterval *action = CCBezierBy::create(3, bezier);
        action = action->reverse();
        mWoman->runAction(action);
    }

    if(n == 3)  //Reset
    {
        //Reset
        mWoman->stopAllActions();
        mWoman->setPosition( ccp( 30, 200));
        mWoman->setRotation( 0.0f);
        mWoman->setScale( 1.0f);        
    }

    if(n == 4)  //Jump
    {
        CCActionInterval *action = CCJumpBy::create(2, ccp(400, 2), 50, 3);
        mWoman->runAction(action);
    }
}

º£Áö¾î °î¼± °æ·Î·Î ¿òÁ÷À϶§ Á¡À» °è¼Ó Âï¾îº¸ÀÚ.
CCLayer ¶Ç´Â CCLayerColor¸¦ »ó¼ÓÇÑ HelloWorld¿¡ °¡»óÇÔ¼ö draw¸¦ Ãß°¡ÇÑ´Ù.

m_debugDraw·Î mWomanÀÇ À§Ä¡¸¦ °è¼Ó Âï´Â´Ù.

ÀÌ·± µð¹ö±ë ÄÚµå´Â ¹èÆ÷½Ã¿¡´Â ¹Ýµå½Ã Á¦°Å µÇ¾î¾ß ÇÑ´Ù.

Action µð¹ö±ë
void HelloWorld::draw()
{
    __super::draw();

    //µð¹ö±ëÀ» À§Çؼ­ ÀÌ·± Äڵ带 »ç¿ëÁßÀÌ´Ù.
    //¾Æ·¡ ÄÚµå·Î ÀÎÇؼ­ °è¼Ó Á¡À» Ãß°¡ÇÑ´Ù. ¹èÆ÷½Ã¿¡´Â Á¦°ÅÇØ¾ß ÇÑ´Ù.
    glPointSize(5);
    m_debugDraw->appendPoint( mWoman->getPosition(), 1, 0, 0);
    m_debugDraw->appendPoint( ccp(30, 200), 0, 0, 0);
    m_debugDraw->appendPoint( ccp(30 + 150, 200 + 100), 0, 0, 0);
    m_debugDraw->appendPoint( ccp(30 + 250, 200 - 100), 0, 0, 0);
    m_debugDraw->appendPoint( ccp(30 + 350, 200), 0, 0, 0);
}

DebugDraw °´Ã¼´Â tutorial09.htmlÀ» Âü°íÇÑ´Ù.