本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010

一、改变动作执行对象


CCTargetedAction类可以改变动作的执行对象。一般默认的动作执行对象是调用runAction的对象。有时候要自定

义动作执行对象,这时候需要使用CCTargetedAction。

1、项目示例。

新建Cocos2D-X项目,取名为“MyCCActionTarget”,然后在HelloWorldScene.cpp文件的init函数中添加如下代码。

bool HelloWorld::init()
{
bool bRet = false;
do
{
CC_BREAK_IF(! CCLayer::init()); //获得尺寸大小
CCSize s = CCDirector::sharedDirector()->getWinSize(); //创建精灵
CCSprite* m_tamara = CCSprite::create("grossinis_sister1.png");
CCSprite* m_kathia = CCSprite::create("grossinis_sister2.png"); //设置精灵的位置
m_kathia->setPosition( ccp(s.width/3, s.height/2));
m_tamara->setPosition( ccp(2*s.width/3, s.height/2)); //添加精灵到图层
addChild(m_tamara, 2);
addChild(m_kathia, 3); CCJumpBy* jump1 = CCJumpBy::create(2,CCPointZero,100,3);
CCJumpBy* jump2 = (CCJumpBy*)jump1->copy()->autorelease();
CCRotateBy* rot1 = CCRotateBy::create(1, 360);
CCRotateBy* rot2 = (CCRotateBy*)rot1->copy()->autorelease(); CCTargetedAction *t1 = CCTargetedAction::create(m_kathia, jump2);
CCTargetedAction *t2 = CCTargetedAction::create(m_kathia, rot2); CCSequence* seq = (CCSequence*)CCSequence::create(jump1, t1, rot1, t2, NULL);
CCRepeatForever *always = CCRepeatForever::create(seq); m_tamara->runAction(always); bRet = true;
} while (0); return bRet;
}

它的定义使用create函数,第一个参数是执行动作的节点,第二个参数是须执行的动作。这样一来,虽然调用

runAction的是m_tamara,但是执行到t1和t2时,执行动作的节点就变为了m_kathia。

2、示例效果图。

            

二、函数回调动作


有时候某些动作完成后,需要执行一些数据上的处理,比如攻击一个敌人,需要处理加减血等。这时需要使用函

数回调动作CCCallFunc等。它们的继承关系如下图所示。

其中CCCallFunc就是回调函数,该回调的函数不含参数。CCCallFunc的回调函数以CCNode对象和数据作为参

数。“N”就是“Node”的意思;“D”就是“Data”的意思,数据可以是任何类型的。CCCallFuncO是以CCObject作为

回调函数参数的,“O”就是“Object”的意思。

1、函数回调的使用方法

<1> CCCallFunc

CCCallFunc::create(CCObject * pSelectorTarget,SEL_CallFunc selector)

作用:创建一个回调动作(调用不带参数的回调方法)。

参数1:目标对象。

参数2:目标回调函数。

<2> CCCallFuncN

CCCallFunc::create(CCObject * pSelectorTarget,SEL_CallFuncN selector)

作用:创建一个回调动作(调用带一个参数的回调方法)。

参数1:目标对象。

参数2:目标回调函数。

<3> CCCallFuncND

CCCallFuncND::create(CCObject * pSelectorTarget,SEL_CallFuncND selector,void * d)

作用:创建一个回调动作(调用带两个参数的回调方法)。

参数1:目标对象。

参数2:目标回调函数。

参数3:可以是任意类型。

2、项目示例。

<1> 首先新建Cocos2D-X项目,取名为“MyCCActionCallFunc”,然后在HelloWorldScene.h文件中声明成员函数。

void callback1();
void callback2(CCNode* sender);
void callback3(CCNode* sender, void* data);

<2> 在HelloWorldScene.cpp文件中的init函数中添加如下所示代码。

bool HelloWorld::init()
{
bool bRet = false;
do
{
CC_BREAK_IF(! CCLayer::init()); //获得尺寸大小
CCSize s = CCDirector::sharedDirector()->getWinSize(); //创建精灵
CCSprite* m_grossini = CCSprite::create("grossini.png");
CCSprite* m_tamara = CCSprite::create("grossinis_sister1.png");
CCSprite* m_kathia = CCSprite::create("grossinis_sister2.png"); //设置精灵的位置
m_grossini->setPosition( ccp(s.width/2, s.height/2));
m_tamara->setPosition( ccp(s.width/4, s.height/2));
m_kathia->setPosition( ccp(3 * s.width/4, s.height/2)); //添加精灵到图层
addChild(m_grossini, 1);
addChild(m_tamara, 2);
addChild(m_kathia, 3); //建立动作并执行回调动作
CCFiniteTimeAction* action = CCSequence::create(
CCMoveBy::create(2, ccp(200,0)),
CCCallFunc::create(this, callfunc_selector(HelloWorld::callback1)), NULL); CCFiniteTimeAction* action2 = CCSequence::create(
CCScaleBy::create(2 , 2),
CCFadeOut::create(2),
CCCallFuncN::create(this, callfuncN_selector(HelloWorld::callback2)), NULL); CCFiniteTimeAction* action3 = CCSequence::create(
CCRotateBy::create(3 , 360),
CCFadeOut::create(2),
CCCallFuncND::create(this, callfuncND_selector(HelloWorld::callback3), (void*)0xbebabeba), NULL); //执行动作
m_grossini->runAction(action);
m_tamara->runAction(action2);
m_kathia->runAction(action3); bRet = true;
} while (0); return bRet;
}

<3> 最后在HelloWorldScene.cpp文件中添加如下所示函数。

void HelloWorld::callback1()
{
CCSize s = CCDirector::sharedDirector()->getWinSize();
CCLabelTTF *label = CCLabelTTF::create("callback 1 called", "Marker Felt", 16);
label->setPosition(ccp( s.width/4*1,s.height/2)); addChild(label);
} void HelloWorld::callback2(CCNode* sender)
{
CCSize s = CCDirector::sharedDirector()->getWinSize();
CCLabelTTF *label = CCLabelTTF::create("callback 2 called", "Marker Felt", 16);
label->setPosition(ccp( s.width/4*2,s.height/2)); addChild(label);
} void HelloWorld::callback3(CCNode* sender, void* data)
{
CCSize s = CCDirector::sharedDirector()->getWinSize();
CCLabelTTF *label = CCLabelTTF::create("callback 3 called", "Marker Felt", 16);
label->setPosition(ccp( s.width/4*3,s.height/2)); addChild(label);
}

3、示例效果图。

            

三、过程动作


很多时候,在进入游戏之前都需要载入动作,这时候需要一些动作用来实现载入时的动画。Cocos2D-X提供了

CCProgressTo和CCProgressFromTo来实现这个动画,但是执行这种动作的节点是CCProgressTimer。

1、项目示例。

新建Cocos2D-X项目,取名为“MyCCActionProgress”,在HelloWorldScene.cpp文件的init函数中添加如下代码。

bool HelloWorld::init()
{
bool bRet = false;
do
{
CC_BREAK_IF(! CCLayer::init()); CCSize s = CCDirector::sharedDirector()->getWinSize(); CCProgressTo *to1 = CCProgressTo::create(2, 100);
CCProgressTo *to2 = CCProgressTo::create(2, 100); CCProgressTimer *left = CCProgressTimer::create(CCSprite::create("grossinis_sister1.png"));
left->setType( kCCProgressTimerTypeRadial );
addChild(left);
left->setPosition(ccp(100, s.height/2));
left->runAction( CCRepeatForever::create(to1)); CCProgressTimer *right = CCProgressTimer::create(CCSprite::create("blocks.png"));
right->setType(kCCProgressTimerTypeRadial);
// Makes the ridial CCW
right->setReverseProgress(true);
addChild(right);
right->setPosition(ccp(s.width-100, s.height/2));
right->runAction( CCRepeatForever::create(to2)); bRet = true;
} while (0); return bRet;
}

<1> 首先是定义CCProgressTo或CCProgressFromTo。第一个参数都是动作时间;CCProgressTo的第二个参数是结

束时图片显示的百分比,CCProgressFromTo的第二个参数是开始时图片显示的百分比;CCProgressFromTo的第三

个参数是结束时图片显示的百分比。

<2> 接下来是定义CCProgressTimer,传入精灵对象来定义,通过调用setType函数来设置动画的类型:

kCCProgressTimerTypeRadial是圆形扫描的动画,kCCProgressTimerTypeBar是直线扫描的动画。

<3> 调用setReverseProgress函数设置正反的方向。kCCProgressTimerTypeBar类型的通过setBarChangeRate设置

水平和竖直的变化量。

<4> 通过调用setMidpoint函数设置开始点,(0,0)为左上,(1,1)为右下,其他点可以用浮点数来表示

2、示例效果图。

              

源码下载地址

最新文章

  1. tree view
  2. [Environment Build] Win10下Appach配置
  3. 《OD学hadoop》第三周0709
  4. 一些有用的javascript实例分析(一)
  5. NGINX----源码阅读----init配置脚本
  6. 面向对象 &quot;一&quot;
  7. C# Dapper 轻量ORM调试对SQLServer
  8. lodash源码分析之缓存使用方式的进一步封装
  9. hdu 1043(经典搜索)
  10. Tomcat内核之类加载器工厂
  11. HttpHandler和ashx使用Session 出现未初始化异常
  12. [20190306]奇怪的查询结果.txt
  13. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(3)- 异常
  14. 每日英语:Mystery Medical Symptoms Hit a Surprising Number of Patients
  15. linux基础01-bash特性
  16. Nginx以服务方式启动并用定时任务每天备份日志
  17. jfinal如何设置使用哪种模板引擎(视图)
  18. java客户端调用ftp上传下载文件
  19. js ajax跨域
  20. CodeForces - 1098.DIV1.C: Construct a tree(贪心,构造)

热门文章

  1. BZOJ 2286 消耗战
  2. HDU 5319 Painter (模拟)
  3. 06day2
  4. wxWidgets进度条
  5. id to load is required for loading----id被要求加载exception
  6. Android手机部分名词浅谈
  7. 如何调试Android Framework?
  8. 如何使用 Java 中的数组
  9. linux下的加减运算
  10. Android 所有版本区别总结(转)