zoukankan      html  css  js  c++  java
  • 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, 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;
    			}
    		}
    	}
    
    }
    

  • 相关阅读:
    运算符的方向--好神奇
    a++ 和 ++a ;
    c语言中!和~的区别
    函数的参数,参数为数组
    反射的理解
    ThreadLocal类
    多线程面试题-sleep()和wait()区别
    话题1-关键字
    实现多线程的另一种方式-Callable
    线程池
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6734447.html
Copyright © 2011-2022 走看看