Cocos2d-X中的动作特效

前端之家收集整理的这篇文章主要介绍了Cocos2d-X中的动作特效前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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,255),winSize.width,winSize.height);
		}
		else
		{
			layer = CCLayerColor::create(ccc4(128,128,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,12));
	}

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

    //网格从下到上消失
	if (an == "CCFadeOutUpTiles")
	{
		action = CCFadeOutUpTiles::create(5,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,12),56,5.0f);
	}

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

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

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

    //创建一个3D水波特效
	if (an == "CCRipple3D")
	{
        //参数:时间,坐标,半径,振幅
		action = CCRipple3D::create(10,100,10,50.0f);
	}

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

    //创建一个3D瓷砖晃动的效果
	if (an == "CCShakyTiles3D")
	{
        //参数:时间,Z轴是否晃动
		action = CCShakyTiles3D::create(5,true);
	}

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

    //瓷砖洗牌特效
	if (an == "CCShuffleTiles")
	{
        //参数:时间,随机数
		action = CCShuffleTiles::create(5,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,12));
	}

     //创建一个扭曲特效
	if (an == "CCTwirl")
	{
        //时间,扭曲次数,振幅
		action = CCTwirl::create(5,5,5.0f);
	}

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

     //创建一个3D波动效果
	if (an == "CCWaves3D")
	{
        //参数:时间,振幅
		action = CCWaves3D::create(5,5.0f);
	}

    //创建一个3D瓷砖波动效果
	if (an == "CCWavesTiles3D")
	{
        //参数:时间,振幅
		action = CCWavesTiles3D::create(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;
			}
		}
	}

}
原文链接:https://www.f2er.com/cocos2dx/346223.html

猜你在找的Cocos2d-x相关文章