Cocos2d-X中提供了非常丰富的动作特效
例如:网格动画
扭曲特效
3D瓷砖波动特效
程序代码:
#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[i]; 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[idx]; 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; } } } }