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;
			}
		}
	}

}
				
时间: 2024-11-08 19:22:07

Cocos2d-X中的动作特效的相关文章

Cocos2d-X中的动作展示《二》

由于Cocos2d-X中的动作较多,我将所有的动作制作成了一个滚动视图,每个滚动视图上都有动作名,单击滚动视图就可以展示相应的动作 程序效果图: 使用滚动视图实现动作切换 动作展示 首先创建一个ActionMore类 ActionMore.h中的代码 #ifndef _ActionMore_H_ #define _ActionMore_H_ #include "cocos2d.h" #include "cocos-ext.h" USING_NS_CC; USING_

Cocos2d-x手机游戏开发中-组合动作

动作往往不是单一,而是复杂的组合.我们可以按照一定的次序将上述基本动作组合起来,形成连贯的一套组合动作.组合动作包括以下几类:顺序.并列.有限次数重复.无限次数重复.反动作和动画.动画我们会在下一节介绍,本节我们重点顺序.并列.有限次数重复.无限次数重复和反动 下面我们通过一个实例介绍一下组合动作的使用,这个实例如下图所示,下图是一个操作菜单场景,选择菜单可以进入到下图动作场景,在下图动作场景中点击Go按钮可以执行我们选择的动作效果,点击Back按钮可以返回到菜单场景. 下面我们再看看具体的程序

让Cocos Studio 2.3.2制作UI界面中控件支持运行3d动作特效的间接途径

引子 下了课有点小空,回想起前天的Studio中UI控件的3D动作问题,还是有点放心不下,毕竟3D高级动作特效是一件游戏开发的"法宝".在仔细地研究了Waves3D等3D高级动作特效之后,我找到了一种如本文标题所示的间接途径.有兴趣的朋友可以参考一下. 实现过程记录 先上图,下图给出的是我的教学游戏中游戏中启动场景在Cocos Studio 2.3.2中的截图,同学们可以注意我在图中标记的部分. 显然,在上图中,我在原先的Cocos2d-x 2.x(结合早期的CocoStudio 2.

Cocos2d-x Lua中实例:特效演示

Cocos2d-x Lua中实例:特效演示 下面我们通过一个实例介绍几个特效的使用,这个实例如下图所示,上图是一个操作菜单场景,选择菜单可以进入到下图动作场景,在下图动作场景中点击Go按钮可以执行我们选择的特性动作,点击Back按钮可以返回到菜单场景. 特效实例 我们重点看看MyActionScene场景,MyActionScene.lua主要代码如下: [html] view plaincopy … … local sprite                                 

Cocos2d-x Lua中网格动作

Cocos2d-x Lua中网格动作 GridAction它有两个主要的子类Grid3DAction和TiledGrid3DAction,TiledGrid3DAction系列的子类中会有瓦片效果,如下图所示是Waves3D特效(Grid3DAction子类),如后图所示是WavesTiles3D特效(TiledGrid3DAction子类),比较这两个效果我们会看到瓦片效果的特别之处是界面被分割成多个方格. Waves3D特效 WavesTiles3D特效 网格动作都是采用3D效果给用户的体验

Cocos2d-x-v3中3D网格特效动画的应用

Cocos2d-x-v3中3D网格特效动画的应用 一.网格特效的使用原理 基础的动作是对节点整体进行移动,变形等操作,网格特效的原理是将节点分割成多个尺寸相同的网格,根据改变每个网格块的属性使整体节点产生3D的效果. 二.网格特效的基本用法 在cocos2d-x中,v3的版本新引入了一个类NodeGrid,专门用来包装网格的特效,示例如下:     //获取屏幕尺寸     Size visibleSize = Director::getInstance()->getVisibleSize();

如何在Cocos2D游戏中实现A*寻路算法(一)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 该篇博客由iOS课程团队的Johann Fradj发布,他现在是一个全职开发iOS的开发者.他是Hot Apps Factory(其是App Cooker的创造者)的共同创建

Android 中 View 炸裂特效的实现分析 &lt;IT蓝豹&gt;

前几天微博上被一个很优秀的 Android 开源组件刷屏了 - ExplosionField,效果非常酷炫,有点类似 MIUI 卸载 APP 时的动画,先来感受一下. ExplosionField 不但效果很拉风,代码写得也相当好,让人忍不住要拿来好好读一下. 创建 ExplosionField ExplosionField 继承自 View,在 onDraw 方法中绘制动画特效,并且它提供了一个 attach2Window 方法,可以把 ExplosionField 最为一个子 View 添加

Vue 中的动画特效

Vue 中的动画特效 CSS 实现标签显隐 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-U