CCWaves* CCWaves::create(float duration, const CCSize& gridSize, unsigned int waves, float amplitude, bool horizontal, bool vertical)
{
    CCWaves *pAction = new CCWaves();

    if (pAction)
    {
        if (pAction->initWithDuration(duration, gridSize, waves, amplitude, horizontal, vertical))
        {
            pAction->autorelease();
        }
        else
        {
            CC_SAFE_RELEASE_NULL(pAction);
        }
    }

    return pAction;
}
CCObject* CCWaves::copyWithZone(CCZone *pZone)
{
    CCZone* pNewZone = NULL;
    CCWaves* pCopy = NULL;
    if(pZone && pZone->m_pCopyObject) 
    {
        //in case of being called at sub class
        pCopy = (CCWaves*)(pZone->m_pCopyObject);
    }
    else
    {
        pCopy = new CCWaves();
        pZone = pNewZone = new CCZone(pCopy);
    }

    CCGrid3DAction::copyWithZone(pZone);

    pCopy->initWithDuration(m_fDuration, m_sGridSize, m_nWaves, m_fAmplitude, m_bHorizontal, m_bVertical);
    
    CC_SAFE_DELETE(pNewZone);
    return pCopy;
}