【Cocos2d-X开发学习笔记】第18期:动作类之改变动作对象、函数回调动作以及过程动作的使用
本系列学习教程使用的是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、示例效果图。
【Cocos2d-X开发学习笔记】第18期:动作类之改变动作对象、函数回调动作以及过程动作的使用的更多相关文章
- Rest API 开发 学习笔记(转)
Rest API 开发 学习笔记 概述 REST 从资源的角度来观察整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表示方式.获得这些表徵致使这些应用程序转变了其状态.随着 ...
- Kinect开发学习笔记之(一)Kinect介绍和应用
Kinect开发学习笔记之(一)Kinect介绍和应用 zouxy09@qq.com http://blog.csdn.net/zouxy09 一.Kinect简单介绍 Kinectfor Xbox ...
- 【前端】移动端Web开发学习笔记【2】 & flex布局
上一篇:移动端Web开发学习笔记[1] meta标签 width设置的是layout viewport 的宽度 initial-scale=1.0 自带 width=device-width 最佳实践 ...
- 【前端】移动端Web开发学习笔记【1】
下一篇:移动端Web开发学习笔记[2] Part 1: 两篇重要的博客 有两篇翻译过来的博客值得一看: 两个viewport的故事(第一部分) 两个viewport的故事(第二部分) 这两篇博客探讨了 ...
- 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址
驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...
- android开发学习笔记000
使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个 ...
- 高性能Cordova App开发学习笔记
高性能Cordova App开发学习笔记 文件结构 添加插件 构建准备 各个www的作用,prepare命令会将hello\www的内容会拷贝到platform下的wwww目录,知道该改哪里了吧?如果 ...
- 步步为营 SharePoint 开发学习笔记系列总结
转:http://www.cnblogs.com/springyangwc/archive/2011/08/03/2126763.html 概要 为时20多天的sharepoint开发学习笔记系列终于 ...
- ASP.NET Core Web开发学习笔记-1介绍篇
ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...
- Chrome扩展,应用开发学习笔记之2---恶搞百度一下
Chrome扩展,应用开发学习笔记之2 恶搞百度一下 前面我们介绍了一个最简单的chrome扩展时钟,如今我来介绍一下一个恶搞百度一下的chrome扩展程序. 前面说过,manifest.json文件 ...
随机推荐
- HDU 1058 Humble Numbers【DP】
题意:给出丑数的定义,只含有2,3,5,7这四个素数因子的数称为素数.求第n个丑数. 可以先观察几个丑数得出规律 1:dp[1] 2:min(1*2,1*3,1*5,1*7) 3:min(2*2,1* ...
- 二分图带权匹配、最佳匹配与KM算法
---------------------以上转自ByVoid神牛博客,并有所省略. [二分图带权匹配与最佳匹配] 什么是二分图的带权匹配?二分图的带权匹配就是求出一个匹配集合,使得集合中边的权值之和 ...
- cocos2d-x使用python脚本创建项目的简单方法
本文有CC原创,转载请注明地址:http://blog.csdn.net/oktears/article/details/13297003 在cocos2d-x2.1.4以上的版本中,取消了使用vs模 ...
- 纯CSS3大转盘抽奖(响应式、可配置)
源于前段时候微信小程序最初火爆公测时段,把以前用 Canvas 实现的大转盘抽奖移植成微信小程序,无奈当时小程序对 Canvas 支持不够完善,只好降低用 CSS3 实现.虽然比不上 Canvas 绘 ...
- Java 碰撞的球 MovingBall (整理)
package demo; /** * Java 碰撞的球 MovingBall (整理) * 声明: * 这份源代码没有注释,已经忘记了为什么要写他了,基本上应该是因为当时觉得好玩吧. * 有时候想 ...
- android 中解析XML的方法(转)
在XML解析和使用原始XML资源中都涉及过对XML的解析,之前使用的是 DOM4J和 XmlResourceParser 来解析的.本文中将使用XmlPullParser来解析,分别解析不同复杂度的t ...
- 正则化,数据集扩增,Dropout
正则化方法:防止过拟合,提高泛化能力 在训练数据不够多时,或者overtraining时,常常会导致overfitting(过拟合).其直观的表现如下图所示,随着训练过程的进行,模型复杂度增加,在tr ...
- vim 常用命令总结
https://www.ibm.com/developerworks/cn/linux/l-cn-tip-vim/ 1 文档开头末尾 [[ 开头 ]]末尾 2 删除全部 :%d 3 剪切.复制.粘贴 ...
- Eclipse实用快捷键
经典常用快捷键1. [ALT+/]此快捷键为用户编辑的好帮手,能为用户提供内容的辅助,不要为记不全方法和属性名称犯愁,当记不全类.方法和属性的名字时,多体验一下[ALT+/]快捷键带来的好处吧. 2. ...
- Heritrix源码分析(十五) 各种问题总结(转)
开博客以及建立Heritrix 群有一段时间了(这里谢谢大家的关注),这篇博客将整理这段时间所遇到的问题.同时由于自己从今年5月份开始就不怎么接触Heritrix,很多东西开始遗忘(不过里面思想没忘) ...