cocos2d-x学习笔记-CCAction动作类继承关系图及理解

本文详细介绍了Cocos2d-x中各种动作类的使用方法及区别,包括移动、缩放、旋转等常见动作,并提供了丰富的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是自己整理的, 如果有错误,请大牛们提出纠正, 谢谢。

下面是继承关系图:


CCAction.h头文件夹, 包含了三个类; CCActionInterval.h头文件夹包含了基本的常用动作;  CCActionProgressTimer.h、CCActionCamera.h、CCActionCatmullRom.h、CCActionEase.h都继承自CCActionInterval类.

以下是对这些类的理解, 如果看不到,再刷新下网页即可.

bool HelloWorld::init() {
	if (!CCLayer::init()) {
		return false;
	}
	CCMenuItemImage *pCloseItem = CCMenuItemImage::create("CloseNormal.png",
			"CloseSelected.png", this,
			menu_selector(HelloWorld::menuCloseCallback));
	pCloseItem->setPosition(
			ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));
	CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
	pMenu->setPosition(CCPointZero);
	this->addChild(pMenu, 1);

	CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();
	cache->removeUnusedSpriteFrames();
	cache->addSpriteFramesWithFile("animation/grossini_family.plist",
			"animation/grossini_family.png");
	//grossini.png grossinis_sister1.png  grossinis_sister2.png
	CCSprite* gross = CCSprite::createWithSpriteFrame(
			cache->spriteFrameByName("grossini.png"));
	CCSprite* sister1 = CCSprite::createWithSpriteFrame(
			cache->spriteFrameByName("grossinis_sister1.png"));
	CCSprite* sister2 = CCSprite::createWithSpriteFrame(
			cache->spriteFrameByName("grossinis_sister2.png"));
	gross->setPosition(ccp(200, 100));
	sister1->setPosition(ccp(200, 500));
	addChild(gross);
	addChild(sister1);
	/////////////////////////////
	/** Action动作*/
	// CCSequence 按顺序执行动作, 下面会有学习
	// CCMoveBy  移动目标   参数1:移动到目标坐标所需的时间 参数2:目标坐标(pos)
	// CCMoveTo  作用、参数一样
	// 两者:支持支持reverse(倒退), CCMoveBy:移动到(相对当前的坐标再加pos), CCMoveTo:直接移动到pos
	/*
	 CCActionInterval* moveBy = CCMoveBy::create(2.0f, ccp(500, 500));
	 CCActionInterval* moveTo = CCMoveTo::create(2.0f, ccp(500, 500));
	 CCActionInterval* ToBack = moveTo->reverse();

	 gross->runAction(moveBy);
	 sister1->runAction(CCSequence::create(moveTo, ToBack, NULL));
	 */

	// CCScaleTo  缩放目标   参数1:缩放持续的时间
	//	参数2:缩放比例(scale)(这里是宽高都同时缩放, 还有一种创建是对宽和高进行不同比例的缩放)
	// CCScaleBy  作用、参数一样
	// CCScaleBy:支持reverse(倒退),缩放(相对当前的缩放值再乘以参数2(scale)),
	// CCMoveTo:不支持reverse, 直接缩放到参数2, 不用管原来的缩放比例
	/*
	 gross->setScale(0.5f); // 这里先设置下当前缩放为0.5f, 方便后面对照
	 sister1->setScale(0.5f);
	 CCActionInterval* scaleBy = CCScaleBy::create(5.0f, 3.0f);
	 CCActionInterval* scaleTo = CCScaleTo::create(5.0f, 3.0f);
	 CCActionInterval* scaleToWAndH = CCScaleTo::create(5.0f, 5.0f, 0.8f);

	 sister1->runAction(
	 CCSequence::create(scaleBy, scaleBy->reverse(), scaleToWAndH,
	 NULL));
	 gross->runAction(scaleTo);
	 */

	// CCRotateTo 旋转目标 参数1:旋转的时间
	// 	参数2:旋转饿角度  正数为顺时针, 负数为逆时针,
	// 如果为720,则在RotateTo中实际转了360度,属于代码内部设定, 为360时, CCRotateTo没有作用
	// 另一种create, 参数2: 沿X轴旋转, 参数3:沿Y轴旋转
	// CCRotateBy 作用、参数一样
	// CCRotateBy: 支持reverse(倒退), 在原来的旋转角度上进行旋转
	// CCRotateTo: 不支持reverse, 直接旋转 参数2, 不用管原来的旋转角度
	/*
	CCActionInterval* rotateBy = CCRotateBy::create(3.0f, 360);
	CCActionInterval* rotateTo = CCRotateTo::create(3.0f, 720);
	CCActionInterval* rotateX = CCRotateBy::create(3.0f, 90, 0);
	CCActionInterval* rotateY = CCRotateBy::create(3.0f, 0, 90);

	gross->runAction(rotateTo);
	sister1->runAction(
			CCSequence::create(rotateBy, rotateBy->reverse(), rotateX,
					rotateX->reverse(), rotateY, rotateY->reverse(), NULL));
	*/
	// CCSkewTo 倾斜目标 参数1:倾斜持续时间
	// 	参数2:x轴的倾斜角度, 参数3:y轴的倾斜角度
	// CCSkewBy 作用、参数一样
	// CCSkewBy 支持reverse, 在原来的基础上倾斜
	// CCSkewTo 直接倾斜, 不用管原来的倾斜度
	/*
	gross->setSkewX(10); // 方便后面对比
	gross->setSkewY(10);
	sister1->setSkewX(10);
	sister1->setSkewY(10);
	CCActionInterval * skewBy = CCSkewBy::create(3, 20, 20);
	CCActionInterval * skewTo = CCSkewTo::create(3, 20, 20);
	CCActionInterval * skewByX = CCSkewBy::create(3, 20, 0);
	CCActionInterval * skewByY = CCSkewBy::create(3, 0, 20);

	gross->runAction(skewTo);
	sister1->runAction(
			CCSequence::create(skewBy, skewBy->reverse(),
					CCSkewTo::create(2, 0, 0), skewByX, skewByX->reverse(),
					skewByY, skewByY->reverse(), NULL));
	*/
	// CCJumpTo 跳跃到目标位置 参数1:总的持续时间, 参数2:目标位置(pos)
	// 参数3:跳跃的高度, 参数4:在持续的时间内跳跃几次
	// CCJumpBy 作用、参数相同
	// CCJumpBy 支持reverse, 跳跃到(原来的位置+pos(相当于一段距离)之和)
	// CCJumpTo 直接跳到pos位置, 不用管原来的位置
	/*
	CCActionInterval * jumpBy = CCJumpBy::create(3, ccp(500, 100), 50, 3);
	CCActionInterval * jumpTo = CCJumpTo::create(3, ccp(500, 500), 50, 3);

	gross->runAction(jumpTo);
	sister1->runAction(CCSequence::create(jumpBy, jumpBy->reverse(), NULL));
	*/
	// CCBezier 贝塞尔曲线, 首先定义这个结构体, 设置控制点
	/*
	ccBezierConfig bezierCon;
	bezierCon.controlPoint_1 = CCPointMake(200, 150); //控制点1
	bezierCon.controlPoint_2 = CCPointMake(200, 160); //控制点2
	bezierCon.endPosition = CCPointMake(340, 100); // 结束位置
	*/
	// CCBezierTo 创建一个贝塞尔曲线运动的动作, 参数1:持续时间, 参数2:贝塞尔曲线结构体
	// CCBezierBy 作用和参数一样
	// 当使用CCBezierTo时, ccBezierConfig的点都是绝对坐标点.
	// 但如果使用CCBezierBy, ccBezierConfig的点都是相对坐标点, 支持reverse, 理解和前面的一样
	/*
	CCActionInterval * bezierTo = CCBezierTo::create(2, bezierCon);
	CCActionInterval * bezierBy = CCBezierBy::create(3, bezierCon); //支持反向
	gross->runAction(bezierTo);
	sister1->runAction(CCSequence::create(bezierBy, bezierBy->reverse(), NULL));
	*/
	// CCFadeIn 目标渐变出现, 参数:持续时间
	// CCFadeOut 目标渐变消失, 参数:持续时间
	/*
	CCActionInterval * fadeIn = CCFadeIn::create(2);
	CCActionInterval * fadeOut = CCFadeOut::create(2);
	gross->runAction(CCSequence::create(fadeIn, fadeOut, NULL));
	*/
	// CCTintTo 作用:创建一个色彩变化的动作, 参数1:色彩变化的动作, 参数2 :红色分量, 参数3:绿色分量, 参数3:蓝色分量
	// CCTintBy 作用和参数一样, 同理, 它的色彩渐变也是相对原来的色彩进行的, 同理, 也支持reverse
	/*
	CCActionInterval * tintTo = CCTintTo::create(4, 255, 255, 0);
	CCActionInterval * tintBy = CCTintBy::create(4, 255, 255, 0);
	gross->runAction(tintTo);
	sister1->runAction(CCSequence::create(tintBy, tintBy->reverse(), NULL));
	*/
	// CCBlink 目标闪烁, 参数1:持续时间, 参数2:闪烁次数
	/*
	CCActionInterval * blink = CCBlink::create(3, 5);
	gross->runAction(blink);
	*/
	// CCDelayTime 延迟动作, 持续时间(延迟执行后续动作)
	//CCActionInterval * delay = CCDelayTime::create(4);
	// CCOrbitCamera 创建一个球面坐标轨迹进行旋转的动作 参数1:旋转轨迹的时间, 参数2:起始半径
	// 	参数3:半径差, 参数4:起始z角, 参数5:旋转z角的差, 参数6:起始x角, 参数7:旋转x角的差
	// 如果参数4和参数5都为0时, 后面的参数6和7好像设置没有用
	// 有时在反转时会产生遮挡问题,解决办法:
	// 1 关闭深度测试 CCDirector::sharedDirector()->setDepthTest(false);
	// 2 设置VertexZ上浮 spriteLeaf->setVertexZ(60);
	//CCActionInterval * orbitCamera = CCOrbitCamera::create(3, 60, 0, 30, 60, 0, 0);
	//gross->runAction(orbitCamera);

	// 关于这个类的用法, 小菜也不是太了解, 以下是在网上找的关于翻牌的代码
	/*
	m_backStatus = 0; // 这两个是我定义的类成员变量
	m_frontStatus = 0;
	CCSprite* back = CCSprite::create("back.png");
	back->setPosition(ccp(640, 360));
	addChild(back);

	CCSequence *seq1 = CCSequence::create(CCDelayTime::create(0.5f),
			CCCallFuncN::create(this,
					callfuncN_selector(HelloWorld::backCallfunc)),
			CCDelayTime::create(1.0f),
			CCCallFuncN::create(this,
					callfuncN_selector(HelloWorld::backCallfunc)),
			CCDelayTime::create(0.5f), NULL);
	CCOrbitCamera *camera1 = CCOrbitCamera::create(2.0, 1, 0, 0, -360, 0, 0);
	CCRepeatForever *repeat1 = CCRepeatForever::create(
			CCSpawn::create(seq1, camera1, NULL));
	back->runAction(repeat1);

	CCSprite* front = CCSprite::create("front.png");
	front->setPosition(ccp(640, 360));
	front->setVisible(false);
	addChild(front);

	CCSequence *seq2 = CCSequence::create(CCDelayTime::create(0.5f),
			CCCallFuncN::create(this,
					callfuncN_selector(HelloWorld::frontCallfunc)),
			CCDelayTime::create(1.0f),
			CCCallFuncN::create(this,
					callfuncN_selector(HelloWorld::frontCallfunc)),
			CCDelayTime::create(0.5f), NULL);
	CCOrbitCamera *camera2 = CCOrbitCamera::create(2.0, 1, 0, 0, -360, 0, 0);
	CCRepeatForever *repeat2 = CCRepeatForever::create(
			CCSpawn::create(seq2, camera2, NULL));
	front->runAction(repeat2);
	*/
	// CCCardinalSpline
	// 首先它们都需要点数组
	CCPointArray* array = CCPointArray::create(20);
	array->addControlPoint(ccp(0,0));
	array->addControlPoint(ccp(210,0));
	array->addControlPoint(ccp(210,240));
	array->addControlPoint(ccp(0,160));
	array->addControlPoint(ccp(0,0));

	// CCCardinalSpline 创建一个基数样条曲线轨迹的动作, 参数1: 完成轨迹所需的时间
	// 参数2: 控制点数组, 参数3: 张力  其值= 0 路径最柔和, = 1 分段直线, >1 向内弯曲, <1 向外弯曲
	// CCCardinalSplineBy 作用和参数一样, 但点数组是相对的,可以理解为距离而不是目标点, 支持reverse
	// CCCatmullRomTo 和 CCCatmullRomBy 是 cardinal基数样条曲线的张力为固定值0.5 的曲线, 用法一样
	/*
	CCActionInterval * cardinalSplineTo = CCCardinalSplineTo::create(3, array,
			0);
	CCActionInterval * cardinalSplineBy = CCCardinalSplineBy::create(3, array,
			0);
	gross->runAction(
			CCSequence::create(cardinalSplineBy, cardinalSplineBy->reverse(),
					cardinalSplineTo, NULL));
	*/
	// CCFollow 跟随动作, 参数1:跟随的目标对象, 参数2: 跟随范围,离开范围就不再跟随
	//用sister1为参照物, 可以添加一个背景图, 这个小菜也不太理解
	/*
	CCActionInterval * move = CCMoveBy::create(5, ccp(4000, 0));
	sister1->runAction(CCSequence::create(move, move->reverse(), NULL));
	CCFollow* follow = CCFollow::create(sister1, CCRectMake(0, 0, 2000, 720));
	this->runAction(follow);
	*/
	// CCSpeed 让目标动作运行速度加倍, 参数1:目标动作, 参数2:倍速
	/*
	CCSpeed * speed = CCSpeed::create(CCMoveBy::create(5, ccp(4000, 0)), 10);
	sister1->runAction(speed);
	*/
	// CCEaseBounceIn 让目标动作赋予反弹力,且以目标动作开始位置开始反弹, 参数:目标动作
//	sister1->runAction(CCEaseBounceIn::create(CCMoveTo::create(3, ccp(800, 500))));
	// CCEaseBounceOut 让目标动作赋予反弹力,且以目标动作结束位置开始反弹, 参数目标动作
//	sister1->runAction(CCEaseBounceOut::create(CCMoveTo::create(3, ccp(800, 500))));
	// CCEaseBounceInOut 让目标动作赋予反弹力,且以目标动作开始和结束位置都反弹, 参数目标动作
//	sister1->runAction(CCEaseBounceInOut::create(CCMoveTo::create(3, ccp(800, 500))));
    // CCEaseBackIn 让目标动作赋予回力,且以目标动作开始位置作为回力点, 参数:目标动作
//	sister1->runAction(CCEaseBackIn::create(CCMoveTo::create(3, ccp(800, 500))));
	// CCEaseBackOut 让目标动作赋予回力,且以目标动作结束位置作为回力点, 参数:目标动作
//	sister1->runAction(CCEaseBackOut::create(CCMoveTo::create(3, ccp(800, 500))));
	// CCEaseBackInOut 让目标动作赋予回力,且以目标动作开始和结束位置作为回力点, 参数:目标动作
//	sister1->runAction(CCEaseBackInOut::create(CCMoveTo::create(3, ccp(800, 500))));
    // CCEaseElasticIn 让目标动作赋予弹性 ,且以目标动作开始位置赋予弹性, 参数:目标动作
//	sister1->runAction(CCEaseElasticIn::create(CCMoveTo::create(3, ccp(800, 500))));
	// CCEaseElasticOut 让目标动作赋予弹性 ,且以目标动作结束位置赋予弹性, 参数:目标动作
//	sister1->runAction(CCEaseElasticOut::create(CCMoveTo::create(3, ccp(800, 500))));
	// CCEaseElasticInOut 让目标动作赋予回力,且以目标动作开始和结束位置赋予弹性, 参数:目标动作
//	sister1->runAction(CCEaseElasticInOut::create(CCMoveTo::create(3, ccp(800, 500))));
    // CCEaseExponentialIn  让目标动作缓慢开始, 参数:目标动作
//	sister1->runAction(CCEaseExponentialIn::create(CCMoveTo::create(3, ccp(800, 500))));
	// CCEaseExponentialOut 让目标动作缓慢结束, 参数:目标动作
//	sister1->runAction(CCEaseExponentialOut::create(CCMoveTo::create(3, ccp(800, 500))));
	// CCEaseExponentialInOut 让目标动作缓慢开始和结束, 参数:目标动作
//	sister1->runAction(CCEaseExponentialInOut::create(CCMoveTo::create(3, ccp(800, 500))));
    // CCEaseRateAction  让目标动作设置速率, 参数1:目标动作, 参数2:速率
//	sister1->runAction(CCEaseRateAction::create(CCMoveTo::create(4, ccp(800, 500)), 5));
    // CCEaseSineIn  动作由慢到快, 参数:目标动作
//	sister1->runAction(CCEaseSineIn::create(CCMoveTo::create(3, ccp(800, 500))));
	// CCEaseSineOut  动作由快到慢, 参数:目标动作
//	sister1->runAction(CCEaseSineOut::create(CCMoveTo::create(3, ccp(800, 500))));
	// CCEaseSineInOut  动作由慢到快再快到慢, 参数:目标动作
//	sister1->runAction(CCEaseSineInOut::create(CCMoveTo::create(3, ccp(800, 500))));
    // CCSpawn
	// 作用:让多个动作同时执行
	// 参数:目标动作的可变参数
	/*
	CCActionInterval * move = CCMoveTo::create(10, ccp(500,500));
	CCActionInterval * scale = CCScaleTo::create(2, 3);
	CCActionInterval * rotate = CCRotateTo::create(4, 190);
	CCFiniteTimeAction * spawn =CCSpawn::create(move,scale,rotate,NULL);
	sister1->runAction(spawn);
	*/
	// CCSequence
	// 作用:让多个动作按照前后顺序逐一执行
	// 参数:目标动作的可变参数
	/*
	CCActionInterval * move = CCMoveTo::create(2, ccp(500,500));
	CCActionInterval * scale = CCScaleTo::create(2, 3);
	CCFiniteTimeAction * seq= CCSequence::create(move,scale,NULL);
	sister1->runAction(seq);
	*/
	// 扩展如果要对目标动作全部进行方向运动,可以使用如下形式操作
	/*
	CCFiniteTimeAction *seq = CCSequence::create(CCMoveBy::create(2, ccp(500,500)), CCScaleBy::create(2, 3), NULL);
	CCFiniteTimeAction * reverseseq = CCSequence::create(seq,seq->reverse(),NULL);
	*/
	// 注意CCSequence中的所有动作都必须支持reverse函数,否则会出现异常
	/*
	 CCActionInterval * move = CCMoveBy::create(2, ccp(500,500));
	 CCActionInterval * scale = CCScaleBy::create(2, 3);
	 CCFiniteTimeAction * seq= CCSequence::create(move,scale,NULL);
	 CCFiniteTimeAction * reveseseq = CCSequence::create(seq,seq->reverse(),NULL);
	 sister1->runAction(reveseseq);
	*/
	// CCRepeat
	// 作用:对目标动作进行重复运动(目标动作可以是CCSequence ,CCSpawn)
	// 参数1:目标动作
	// 参数2:重复次数
	/*
	CCActionInterval * move = CCMoveTo::create(2, ccp(500,500));
	CCActionInterval * move2 = CCMoveTo::create(2, ccp(100,100));
	CCFiniteTimeAction*seq =CCSequence::create(move,move2,NULL);
	CCFiniteTimeAction *repeat = CCRepeat::create(seq, 3);
	sister1->runAction(repeat);
	*/
	// CCRepeatForever
	// 作用:对目标动作进行永久性的重复运动(目标动作可以是CCSequence ,CCSpawn)
	// 参数:目标动作
	/*
	CCActionInterval * move = CCMoveTo::create(1, ccp(500,500));
	CCActionInterval * move1 = CCMoveTo::create(1, ccp(100,100));
	CCFiniteTimeAction* seq = CCSequence::create(move,move1,NULL);
	CCActionInterval * repeatForever =CCRepeatForever::create((CCActionInterval* )seq);
	    sister1->runAction(repeatForever);
	*/
	// 关于回调部分, 再次就不写了
	return true;
}
void HelloWorld::backCallfunc(CCNode* node) {
	if (!node)
		return;
	CCSprite* sp = (CCSprite*) node;
	if (!m_backStatus) {
		sp->setVisible(false);
		m_backStatus = 1;
	} else {
		sp->setVisible(true);
		m_backStatus = 0;
	}
}
void HelloWorld::frontCallfunc(CCNode* node) {
	if (!node)
		return;
	CCSprite* sp = (CCSprite*) node;
	if (!m_frontStatus) {
		sp->setVisible(true);
		m_frontStatus = 1;
	} else {
		sp->setVisible(false);
		m_frontStatus = 0;
	}
}

另外介绍两个cocos2d-x超级大牛: 子龙山人和 红孩儿, 子龙山人的上百度一搜就能搜到, 关于红孩儿的, 由于这个名字比较火, 不好找, 在此介绍下:

红孩儿的博客  Cocos2d-x 2.0 之 Actions “三板斧”, 网址:http://blog.youkuaiyun.com/honghaier, 这里里面详细解释了 动作所有类.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值