五毛的cocos2d-x学习笔记05-场景与场景动画,动作

场景切换函数:

  • Director->getInstance()->replaceScene(Scene*);
  • Director->getInstance()->runWithScene(Scene*);

两者的区别在于,如果有Scene存在,使用第一个;第一次运行场景,用第二个。

下面是一个切换场景的关键代码。单击文本跳转到下一个场景。要切换到的场景ImageScene继承自Layer,定义了3个成员函数init,createScene,CREATE_FUNC。

ImageScene.h如下:

 1 #ifndef _IMAGESCENE_H_
 2 #define _IMAGESCENE_H_
 3
 4 #include<iostream>
 5 #include<cocos2d.h>
 6 USING_NS_CC;
 7
 8 class ImageScene :public Layer{
 9 public:
10     virtual bool init();
11     static Scene* createScene();
12     CREATE_FUNC(ImageScene);
13 };
14 #endif

ImageScene.cpp如下:

 1 #include"ImageScene.h"
 2
 3 Scene* ImageScene::createScene(){
 4     Scene *scene = Scene::create();
 5     ImageScene *layer = ImageScene::create();
 6     scene->addChild(layer);
 7
 8     return scene;
 9 }
10 bool ImageScene::init(){
11     if (!Layer::init()){
12         return false;
13     }
14
15     Size size = Director::getInstance()->getVisibleSize();
16
17     Sprite *s = Sprite::create("HelloWorld.png");
18     s->setPosition(size.width/2, size.height/2);
19     addChild(s);
20
21     return true;
22 }

关键代码:

 1 bool HelloWorld::init()
 2 {
 3     //////////////////////////////
 4     // 1. super init first
 5     if ( !Layer::init() )
 6     {
 7         return false;
 8     }
 9     Size visibleSize = Director::getInstance()->getVisibleSize();
10     Point origin = Director::getInstance()->getVisibleOrigin();
11
12     LabelTTF *label = LabelTTF::create("Show Next Scene", "Courier", 36);
13     addChild(label);
14
15     label->setPosition(visibleSize.width/2, visibleSize.height/2);
16
17     EventListenerTouchOneByOne *listener = EventListenerTouchOneByOne::create();
18
19     listener->onTouchBegan = [label](Touch *t, Event *e){
20         if (label->getBoundingBox().containsPoint(t->getLocation())){
21             Director::getInstance()->replaceScene(ImageScene::createScene());
22             return true;
23         }
24         return false;
25     };
26     Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, label);
27     return true;
28 }

运行效果:

场景切换效果能让场景的切换不显得突兀。场景切换效果主要是TransitionScene的子类实现的。

修改关键代码的第21行

Director::getInstance()->replaceScene(TransitionFade::create(3.0f, ImageScene::createScene()));

切换效果:

Action动作

类的主要继承关系图

关键代码:

  • label->runAction(MoveTo::create(1.0f, Point(100, 100)));
  • label->runAction(MoveBy::create(1.0f, Point(-10, -10)));
  • label->runAction(MoveBy::create(1.0f, Point(10, 10))->reverse());//效果和上面一句相同,reverse是反转执行。

效果是不同的,运行效果:

详细代码如下:

bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }

    Size visibleSize = Director::getInstance()->getVisibleSize();

    LabelTTF *label = LabelTTF::create("Hello, Cocos", "Courier", 30);
    label->setPosition(visibleSize.width / 2, visibleSize.height / 2);
    addChild(label);

    EventListenerTouchOneByOne *listener = EventListenerTouchOneByOne::create();
    listener->onTouchBegan = [label](Touch* t,Event* e){
        if (label->getBoundingBox().containsPoint(t->getLocation())){
            label->runAction(MoveTo::create(1.0f, Point(100, 100)));
            //label->runAction(MoveBy::create(1.0f, Point(-10,-10)));
        }
        return false;
    };
    Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, label);
    return true;
}

Repeat/RepeatForever:

//在1秒内完成180度旋转,重复3次。

label->runAction(Repeat::create(RotateBy::create(1.0f, 180), 3));

//在1秒内完成180度旋转,一直重复。
label->runAction(RepeatForever::create(RotateBy::create(1.0f, 180)));

运行结果:

动作混合:Spawn类

//label会一边移动一边旋转

//在末尾写一个NULL,标识数组的结束。
label->runAction(Spawn::create(MoveBy::create(1, Point(100, 100)), RotateBy::create(1, 360), NULL));

运行效果:

动作序列:Sequence类

//label先移动,然后再旋转

//在末尾写一个NULL, 标识数组的结束

label->runAction(Sequence::create(MoveBy::create(1, Point(100, 100), RotateBy::create(1, 360)), NULL));

运行效果:

动作的监听:

CallFunc类继承自FiniteTimeAction,所以可以用这个类来实现监听效果。

//label先移动,然后再旋转,旋转结束之后,弹出一个弹框。

label->runAction(Sequence::create(
                MoveBy::create(1, Point(100, 100)),
                RotateBy::create(1, 360),
                CallFunc::create([](){
                MessageBox("Action Complete", "Complete");
            }), NULL));

运行结果:

附上本节所有源码:

bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }

    Size visibleSize = Director::getInstance()->getVisibleSize();

    LabelTTF *label = LabelTTF::create("Hello, Cocos", "Courier", 30);
    label->setPosition(visibleSize.width / 2, visibleSize.height / 2);
    addChild(label);

    EventListenerTouchOneByOne *listener = EventListenerTouchOneByOne::create();
    listener->onTouchBegan = [label](Touch* t,Event* e){
        if (label->getBoundingBox().containsPoint(t->getLocation())){
            //label->runAction(MoveTo::create(1.0f, Point(100, 100)));
            //label->runAction(MoveBy::create(1.0f, Point(-10,-10)));
            //label->runAction(MoveBy::create(1.0f, Point(10, 10))->reverse());//效果和上面一句相同
            //label->runAction(Repeat::create(RotateBy::create(1.0f, 180), 3));
            //label->runAction(RepeatForever::create(RotateBy::create(1.0f, 180)));
            //在末尾写一个NULL,标识数组的结束。
            //label->runAction(Spawn::create(MoveBy::create(1, Point(100, 100)), RotateBy::create(1, 360), NULL));
            //label->runAction(Sequence::create(MoveBy::create(1, Point(100, 100)), RotateBy::create(1, 360), NULL));
            label->runAction(Sequence::create(
                MoveBy::create(1, Point(100, 100)),
                RotateBy::create(1, 360),
                CallFunc::create([](){
                MessageBox("Action Complete", "Complete");
            }), NULL));

        }
        return false;
    };
    Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, label);
    return true;
}
时间: 2024-08-04 01:24:21

五毛的cocos2d-x学习笔记05-场景与场景动画,动作的相关文章

SWIFT学习笔记05

1.Swift 无需写break,所以不会发生这种贯穿(fallthrough)的情况.2.//用不到变量名,可用"_"替换 for _ in 1...power { answer *= base } 3.case 可以匹配更多的类型模式,包括区间匹配(range matching),元组(tuple)和特定类型的描述. 可以这样用case case 1...3: naturalCount = "a few" 4.如果存在多个匹配,那么只会执行第一个被匹配到的 ca

C++ GUI Qt4学习笔记05

C++ GUI Qt4学习笔记05 qtc++正则表达式 QIntValidator           --  只让用户输入整数 QDoubleValidator     --  只让用户输入浮点数 QRegExpValidator    --  只让用户按照正则表达式定义好的样式进行输入 本章讲解如何使用Qt开发自定义窗口部件. 通过对一个已经存在的Qt窗口部件进行子类化或者直接对QWidget进行子类化,就可以创建自定义窗口部件. 集成自定义窗口到Qt设计师中,这样就可以像使用内置的Qt窗

【学习笔记】jQuery中的动画与效果

1.基本效果 匹配元素从左上角开始变浓变大或缩小到左上角变淡变小 ①隐藏元素 除了可以设置匹配元素的display:none外,可以用以下函数 hide(speed,[callback])  返回值:jQuery  参数-speed:三种预订速度之一的字符串String(slow,normal,fast)或表示动画时长的毫秒数Number  callback:在完成动画时执行的函数,每个匹配元素执行一次 slow=600毫秒  normal=400毫秒  fast=200毫秒 以优雅的动画隐藏所

cocos2d-x实战 C++卷 学习笔记--第6章 场景与层

前言: 一个场景(Scene)是由多个层(Layer)组成,而且层的个数要至少是1,不能为0. 场景切换 场景切换相关函数 1)void  runWithScene(Scene*  scene) 该函数可以运行场景.只能在启动第一个场景时调用该函数.如果已经有一个场景运行,则不能调用该函数. 2)void  replaceScene(Scene*  scene) 切换到下一个场景.用一个新的场景替换当前场景,当前场景被终端释放. 3)void  pushScene(Scene*  scene)

stm32寄存器版学习笔记05 PWM

STM32除TIM6和TIM7外都可以产生PWM输出.高级定时器TIM1和TIM8可以同时产生7路PWM,通用定时器可以产生4路PWM输出. 1.TIM1 CH1输出PWM配置步骤 ①开启TIM1时钟,配置PA8为复用输出 APB2外设时钟使能寄存器(RCC_APB2ENR) APB1外设复位寄存器 (RCC_APB1RSTR) 置1开启.清0关闭. Eg:RCC->APB2ENR|=1<<11; //使能TIM1时钟 配置I/O口: 参见stm32寄存器版学习笔记01 GPIO口的配置

[原创]java WEB学习笔记05:Servlet中的ServletConfig对象

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

【cocos2d-x学习笔记】导演,场景,层,精灵模型

CCDirector导演 单例类,通过CCDirector::sharedDirector函数去获取导演对象 CCDirector* d = new CCDirector() // error,单例对象不应该自己去创建 1)导演负责初始化环境 2)导演负责推动游戏进程 runWithScene, replaceScene, pushScene, popScene 3) 导演负责坐标变换 CCScene 场景:一幕戏 从cocos2dx数据结构来收,它是一个渲染树的根节点 任一时刻,只有一个Sce

Cocos2dx学习笔记10:cocos2dx序列帧动画(1)

在cocos2dx里是不支持gif动画的,所以我们无法给精灵设置gif格式的图片.但是如果我们想实现动画效果呢?那么我们就要自己通过大量的静态图来组成播放成动画. 在cocos2dx里提供了序列帧动画的概念来实现这个功能,动画由帧组成,每一帧都是一个纹理,我们可以使用一个纹理序列来创建动画. 首先找一张动图的gif图,这里QQ群里最近动图的逗逼图太多,我就随便找了一张,把图片另存到桌面,打开ps软件,把图片拖进去,这样gif图会被拆分许多的图层.我们把图层一个一个图层的保存成png的静态图,命名

xml基础学习笔记05

Xpath快速解析 如题一样,本篇主要说说Xpath快速查找XML文档 * Xpatn.Xquery,是专门用来查询xml的语言 * 查询xml非常快 Xpatn.Xquery,是专门用来查询xml的语言 查询xml非常快 下面主要记录一下w2school 上面学习的笔记 XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历. XPath 路径表达式 XPath 使用路径表达式来选取 XML 文档中的节点或者节点集.这些路径表达式和我们在常