`
810364804
  • 浏览: 819851 次
文章分类
社区版块
存档分类
最新评论

【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开发学习笔记-动作类之基础动作的使用示例(下)

    在Cocos2D-X中,动作(Actions)是游戏对象行为的核心组成部分,它们可以改变节点的位置、旋转、缩放、透明度等多种属性,甚至实现复杂的动画效果。本文主要围绕Cocos2D-X中的基础动作类的使用进行深入探讨。 一、...

    Cocos2D-X——动作类之改变动作对象、函数回调动作以及过程动作的使用

    Cocos2D-X开发学习笔记——动作类之改变动作对象、函数回调动作以及过程动作的使用。 教程地址:http://blog.csdn.net/yangyu20121224/article/details/9852205

    Cocos2d-x实战:JS卷——Cocos2d-JS开发

    资源名称:Cocos2d-x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台...

    Cocos2d-x学习笔记

    Cocos2d-x框架除了Windows平台外,还支持iOS、Android、Mac OS X、Web等平台,初学者在掌握了Windows平台的开发后,可以进一步学习如何使用Cocos2d-x跨平台开发,实现一个游戏在多个平台上运行。 在学习过程中,...

    cocos2d-x学习笔记

    `AppDelegate` 类继承自 `cocos2d::CCApplication`,并实现了几个重要的回调函数: - `AppDelegate()`:构造函数,通常用于初始化一些全局变量或对象。 - `~AppDelegate()`:析构函数,清理在构造函数中创建的资源...

    Cocos2D-X开发学习笔记-动作管理类的使用示例

    在"Cocos2D-X开发学习笔记-动作管理类的使用示例"中,我们将深入探讨如何有效地利用动作管理类来实现复杂的动画效果。首先,我们需要了解Cocos2d::ActionManager类,它是Cocos2D-X中的核心组件之一,负责存储和执行...

    Cocos2D-X开发学习笔记-触屏事件使用示例

    本学习笔记将深入探讨如何在Cocos2D-X中处理触屏事件,让游戏能够响应用户的触摸操作。 首先,我们要了解Cocos2D-X中的触摸事件处理机制。在Cocos2D-X中,触屏事件主要通过`Touch`类和`TouchEvent`类来实现。`Touch...

    Cocos2d-x 3.x游戏开发实战pdf含目录

    《Cocos2d-x 3.x游戏开发实战》是一本深度探讨Cocos2d-x 3.x框架的游戏开发书籍,适合对游戏编程有兴趣的开发者学习。Cocos2d-x 是一个开源的、跨平台的2D游戏开发框架,广泛应用于iOS、Android、Windows等多平台的...

    Cocos2D-X开发学习笔记-按键事件使用示例

    总之,Cocos2D-X的按键事件处理是通过`EventListenerKeyboard`类和对应的回调函数实现的,这使得开发者能够轻松响应用户的键盘输入,为游戏或应用增加丰富的交互功能。通过学习和实践,你可以进一步掌握这一关键机制...

    Cocos2D-X开发学习笔记-游戏数据存储项目实例(上)

    在“Cocos2D-X开发学习笔记-游戏数据存储项目实例”中,你可能会学习到如何结合上述技术,创建一个实际的游戏数据存储系统。通过阅读教程和分析提供的项目文件"MyDataSave01",你将深入理解如何在实践中应用这些知识...

    Cocos2D-X开发学习笔记-时间调度schedule函数的使用

    本篇学习笔记主要关注的是Cocos2D-X中的时间调度机制,特别是如何使用`schedule`函数进行周期性任务的执行。 在Cocos2D-X中,时间调度是游戏循环的重要组成部分,它允许开发者在特定的时间间隔内执行某些函数或操作...

    Cocos2d-x实战++JS卷++Cocos2d-JS开发+PDF电子书下载+带书签目录+完整

    3. Cocos2d-JS开发:这里强调的是使用Cocos2d-x框架结合JavaScript语言进行开发的过程。由于Cocos2d-x支持多种编程语言(包括C++、JavaScript和Lua),Cocos2d-JS意味着开发者可以采用JavaScript来构建游戏项目。 4...

    Cocos2d-x实战 JS卷 Cocos2d-JS开发

    《Cocos2d-x实战 JS卷 Cocos2d-JS开发》是一本深入探讨Cocos2d-x游戏引擎JavaScript版本使用的专业书籍。Cocos2d-x是全球范围内广泛采用的游戏开发框架,尤其适用于2D游戏的制作,而Cocos2d-JS则是其JavaScript接口...

    cocos2d-x 3.0

    《cocos2d-x 3.0:游戏开发中的角色移动技术详解》 在游戏开发领域,cocos2d-x是一款广泛使用的开源2D游戏引擎,尤其在移动平台上的应用非常广泛。cocos2d-x 3.0版本带来了许多性能优化和新特性,使得开发者能够更...

    Cocos2d-x实战:C++卷(2版)源代码

    《Cocos2d-x实战:C++卷(2版)源代码》这本书是关于使用Cocos2d-x游戏引擎进行游戏开发的专业指南。Cocos2d-x是一个开源的、跨平台的游戏开发框架,广泛应用于iOS、Android、Windows等多个操作系统。本书以C++语言...

    Cocos2D-X开发学习笔记-动作类之摄像机动作和基本样条动作的使用示例

    Cocos2D-X开发学习笔记-动作类之摄像机动作和基本样条动作的使用示例 教程地址:http://blog.csdn.net/yangyu20121224/article/details/9851099

    Cocos2D-X开发学习笔记-网格动作类的使用示例

    在《Cocos2D-X开发学习笔记-网格动作类的使用示例》教程中,作者yangyu20121224详细讲解了如何在实际项目中运用这些网格动作。通过阅读该教程,你可以了解到如何结合代码实例来实现这些视觉效果,从而提升你的游戏...

    Cocos2D-X开发学习笔记-渲染框架之布景层类的使用示例

    本篇学习笔记主要聚焦于Cocos2D-X的渲染框架,特别是布景层类的使用,这对于构建游戏场景至关重要。 首先,我们要理解Cocos2d-x中的“布景层”(CCLayer)。在Cocos2D-X中,布景层是场景(CCScene)的一个子类,...

    Cocos2d-x实战 JS卷

    《Cocos2d-x实战 JS卷》是一本深入探讨Cocos2d-x游戏开发的专著,主要聚焦于使用JavaScript语言进行游戏编程。Cocos2d-x是一个开源的游戏开发框架,广泛应用于移动设备和桌面平台,支持iOS、Android、Windows等多...

    Cocos2D-X游戏开发技术精解

     《Cocos2D-X游戏开发技术精解》详细介绍如何使用Cocos2D-X引擎开发自己的移动平台游戏。全书共15章,主要内容包括:Cocos2D-X引擎简介;如 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

Global site tag (gtag.js) - Google Analytics