Cocos2d-X开发基础动作特效介绍

cocos2d-x作为一款开源的游戏开发引擎,常用于各类手机游戏开发,且支持各类平台如iOS,Android,BlackBerry,Html5,windowsphone等。cocos2d-x中提供了非常丰富的动作特效,http://www.maiziedu.com/course/7/初学者应灵活掌握,并熟练运用。如下例有几种动画效果:

网格动画

扭曲特效

3D瓷砖波动特效

我们看看从http://www.maiziedu.com/转载的具体实现代码:
#include “ActionEffect.h”
#include “HelloWorldScene.h”

static const char* _actionName] =
{
“CCFadeOutBLTiles”,
“CCFadeOutDownTiles”,
“CCFadeOutTRTiles”,
“CCFadeOutUpTiles”,

"CCFlipX3D",  
"CCFlipY3D",  

"CCJumpTiles3D",  

"CCLens3D",  

"CCLiquid",  

"CCPageTurn3D",  

"CCRipple3D",  

"CCShaky3D",  

"CCShakyTiles3D",  

"CCShatteredTiles3D",  

"CCShuffleTiles",  

"CCSplitCols",  
"CCSplitRows",  
"CCTurnOffTiles",  
"CCTwirl",  
"CCWaves",  
"CCWaves3D",  
"CCWavesTiles3D"  

};

CCScene* ActionEffect::scene()
{
CCScene* s = CCScene::create();
ActionEffect* layer = ActionEffect::create();
s->addChild(layer);
return s;
}

bool ActionEffect::init()
{
CCLayer::init();

CCSize winSize = CCDirector::sharedDirector()->getWinSize();  
  
CCNode* c = CCNode::create();  
_c = c;  
int actionCount = sizeof(_actionName) / sizeof(*_actionName);  
  
for (int i = 0; i < actionCount; i++)  
{  
    /* 
    CCSprite* bg = CCSprite::create("HelloWorld.png"); 
    c->addChild(bg); 
    bg->setPosition(ccp(winSize.width / 2 + i*winSize.width, winSize.height / 2)); 
    */  
    CCLayerColor* layer;  
    if (i % 2 == 0)  
    {  
        layer = CCLayerColor::create(ccc4(192, 192, 192, 255), winSize.width, winSize.height);  
    }  
    else  
    {  
        layer = CCLayerColor::create(ccc4(128, 128, 128, 255), winSize.width, winSize.height);  
    }  
    c->addChild(layer);  
    layer->setPosition(ccp(i*winSize.width, 0));  

    /* 设置Title */  
    const char* title = _actionName;  
    CCLabelTTF* label = CCLabelTTF::create(title, "Arial", 36);  
    layer->addChild(label, 1000);  
    label->setPosition(ccp(winSize.width / 2, winSize.height - 80));  
}  

CCScrollView* view = CCScrollView::create(winSize, c);  
view->setDirection(kCCScrollViewDirectionHorizontal);  
view->setContentSize(CCSize(winSize.width*actionCount, winSize.height));  
addChild(view);  

c->setPositionX((1 - actionCount)*winSize.width);  

// 能触摸  
setTouchEnabled(true);  
setTouchMode(kCCTouchesOneByOne);  

return true;  

}

bool ActionEffect::ccTouchBegan(CCTouch*, CCEvent*)
{
return true;
}

void ActionEffect::testAction(int idx, CCLayerColor* layer)
{
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCSprite* sprite = (CCSprite*)layer->getUserObject();

if (sprite == NULL)  
{  
//  sprite = CCSprite::create("background3.png");  
    sprite = CCSprite::create("HelloWorld.png");  
    layer->setUserObject(sprite);  
    layer->addChild(sprite);  
}  
const char* an = _actionName;  
CCAction* action = NULL;  
sprite->setPosition(ccp(winSize.width / 2, winSize.height / 2));  
CCMoveBy* moveBy = CCMoveBy::create(4, ccp(0, sprite->getContentSize().height / 2 - winSize.height / 2));  

//网格从右上到左下部消失  
//第一个参数:时间  
//第二个参数:网格大小  
if (an == "CCFadeOutBLTiles")  
{  
    action = CCFadeOutBLTiles::create(5, CCSize(16, 12));  
}  

//网格从上到下折叠消失  
 //第一个参数:时间  
//第二个参数:网格大小  
if (an == "CCFadeOutDownTiles")  
{  
    action = CCFadeOutDownTiles::create(5, CCSize(16, 12));  
}  

//网格从左下到右上消失  
if (an == "CCFadeOutTRTiles")  
{  
    action = CCFadeOutTRTiles::create(5, CCSize(16, 12));  
}  

//网格从下到上消失  
if (an == "CCFadeOutUpTiles")  
{  
    action = CCFadeOutUpTiles::create(5, CCSize(16, 12));  
}  

//创建一个X轴3D反转特效  
if (an == "CCFlipX3D") // 影响touch  
{  
    action = CCFlipX3D::create(5);  
}  

//创建一个Y轴3D反转特效  
if (an == "CCFlipY3D")  
{  
    action = CCFlipY3D::create(5);;  
}  

 //网格跳动特效  
if (an == "CCJumpTiles3D")  
{   //参数:时间,网格大小,次数,振幅  
    action = CCJumpTiles3D::create(5, CCSize(16, 12), 56, 5.0f);  
}  

//凸透镜特效  
if (an == "CCLens3D")  
{  
    //参数:时间,网格大小,圆心坐标,圆半径  
    action = CCLens3D::create(5, CCSize(16, 12), ccp(winSize.width / 2, winSize.height / 2), 100);  
}  

 //液体特效  
if (an == "CCLiquid")  
{  
    //参数:时间,网格大小,速度,振幅  
    action = CCLiquid::create(56, CCSize(16, 12), 56, 2.0f);  
}  

//3D翻页特效  
if (an == "CCPageTurn3D")  
{  
    action = CCPageTurn3D::create(5, CCSize(16, 12));  
}  

//创建一个3D水波特效  
if (an == "CCRipple3D")  
{  
    //参数:时间,网格大小,坐标,半径,速度,振幅  
    action = CCRipple3D::create(10, CCSize(16, 12), ccp(winSize.width / 2, winSize.height / 2), 100, 10, 50.0f);  
}  

 //创建一个3D晃动的效果  
if (an == "CCShaky3D")  
{  
    //参数:时间,晃动网格大小,晃动范围,Z轴是否晃动  
    action = CCShaky3D::create(10, CCSize(16, 12), 2, true);  
}  

//创建一个3D瓷砖晃动的效果  
if (an == "CCShakyTiles3D")  
{  
    //参数:时间,晃动网格大小,晃动范围,Z轴是否晃动  
    action = CCShakyTiles3D::create(5, CCSize(16, 12), 2, true);  
}  

 //创建一个3D破碎瓷砖特效  
if (an == "CCShatteredTiles3D")  
{  
    //参数:时间,晃动网格大小,晃动范围,Z轴是否晃动  
    action = CCShatteredTiles3D::create(1, CCSize(16, 12), 7, true);  
}  

//瓷砖洗牌特效  
if (an == "CCShuffleTiles")  
{  
    //参数:时间,网格大小,随机数  
    action = CCShuffleTiles::create(5, CCSize(16, 12), CCRANDOM_0_1()*10000);  
}  

 //多行消失特效(垂直)  
if (an == "CCSplitCols")  
{  
    //参数:时间,行数  
    action = CCSplitCols::create(5, 9);  
}  

//多行消失特效(水平)  
if (an == "CCSplitRows")  
{  
    //参数:时间,行数  
    action = CCSplitRows::create(5, 9);  
}  

  //方块消失  
if (an == "CCTurnOffTiles")  
{  
    //参数:时间,网格大小,随机数  
    action = CCTurnOffTiles::create(5, CCSize(16, 12));  
}  

 //创建一个扭曲特效  
if (an == "CCTwirl")  
{  
    //时间,网格大小,坐标,扭曲次数,振幅  
    action = CCTwirl::create(5, CCSize(16, 12), ccp(winSize.width / 2, winSize.height / 2), 5, 5.0f);  
}  

 //创建一个波动效果  
if (an == "CCWaves")  
{  
    //参数:时间,晃动网格大小,波动速度,振幅,是否水平波动,是否垂直波动  
    action = CCWaves::create(5, CCSize(16, 12), 5, 5.0f, true, false);  
}  

 //创建一个3D波动效果  
if (an == "CCWaves3D")  
{  
    //参数:时间,晃动网格大小,波动速度,振幅  
    action = CCWaves3D::create(5, CCSize(16, 12), 5, 5.0f);  
}  

//创建一个3D瓷砖波动效果  
if (an == "CCWavesTiles3D")  
{  
    //参数:时间,晃动网格大小,波动速度,振幅  
    action = CCWavesTiles3D::create(5, CCSize(16, 12), 5, 5.0f);  
}  
      
if (action)  
{  
    sprite->runAction(action);  
}  

}

void ActionEffect::ccTouchEnded(CCTouch* t, CCEvent*)
{
CCPoint ptStart = t->getStartLocation();
CCPoint ptEnd = t->getLocation();
if (ptStart.getDistanceSq(ptEnd) <= 25)
{
// click
// 点中了哪个子窗口

    // 转换ptStart为ScrollView中的Container的坐标  
    // 再判断被点击的LayerColor  
    CCPoint ptInContainer = _c->convertToNodeSpace(ptStart);  
    CCArray* arr = _c->getChildren(); // 所有的layercolor  
    for (int i = 0; i < sizeof(_actionName) / sizeof(*_actionName); i++)  
    {  
        CCLayerColor* layer = (CCLayerColor*)arr->objectAtIndex(i);  
        if (layer->boundingBox().containsPoint(ptInContainer))  
        {  
            testAction(i, layer);  
            break;  
        }  
    }  
}  

}
*
*

正好扭曲特效最近在研究,支持一下