五毛的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(MoveTo::create(1.0f, Point(-100, -100))->reverse());//MoveTo::reserve()在cocos2d-x3.5之后被屏蔽了,因为没有意义
  • 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;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码匠的流水账

聊聊rocketmq的PullConsumerImpl

io/openmessaging/rocketmq/consumer/PullConsumerImpl.java

2201
来自专栏码匠的流水账

聊聊storm的maxSpoutPending

storm-2.0.0/storm-client/src/jvm/org/apache/storm/Config.java

761
来自专栏Ceph对象存储方案

查询bucket已用量脚本-python

目前仅支持ceph的s3方案,具体配置看说明 # -*- coding: utf-8 -*- import requests import json from ...

2889
来自专栏landv

vb.net_一个半成品

1854
来自专栏程序员的SOD蜜

使用泛型委托,构筑最快的通用属性访问器

最近做一个父类的属性向子类的属性赋值的小程序,用了下AutoMapper组件,感觉不错,想探究下它的原理,自己动手做一个例子试试看。实现这个功能,第一反应使用反...

2499
来自专栏码匠的流水账

聊聊storm的AssignmentDistributionService

本文主要研究一下storm的AssignmentDistributionService

1501
来自专栏yl 成长笔记

web 上读取图片,并转化为指定格式

901
来自专栏函数式编程语言及工具

SDP(6):分布式数据库运算环境- Cassandra-Engine

    现代信息系统应该是避不开大数据处理的。作为一个通用的系统集成工具也必须具备大数据存储和读取能力。cassandra是一种分布式的数据库,具备了分布式数据...

3354
来自专栏码匠的流水账

聊聊rocketmq的ProducerImpl

io/openmessaging/rocketmq/producer/ProducerImpl.java

1031
来自专栏技术栈大杂烩

Python的Sequence切片下标问题

在python中, 切片是一个经常会使用到的语法, 不管是元组, 列表还是字符串, 一般语法就是:

1152

扫码关注云+社区

领取腾讯云代金券