cocos2d-x基础 - 特效(1)

cocos2d-x基础 - 特效(1)

1. 场景切换

设置一个字符块,通过点击字符来切换另一个场景Scene

HelloWorldScene.cpp中加入:

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

Label * label = Label::createWithSystemFont("new Scene", "Courier", 20);
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())) {
        // 点击事件后进行的操作
    }
    return false;
};
// 添加到事件侦听器中
Director::getInstance()->getEventDispatcher()
    ->addEventListenerWithSceneGraphPriority(listener, label);

上面定义了一个label并且为这个label定义了一个点击事件,是让Director切换一个新场景ImageScene

这个ImageScene是下面要自定义的一个场景类,他的作用是显示一张图片

创建新的C++类ImageScene

ImageScene.h

//
//  ImageScene.h
//  Cocos2dFX-mobile
//
//  Created by dzzhyk on 2019/11/14.
//

#ifndef ImageScene_h
#define ImageScene_h

#include <stdio.h>
#include "cocos2d.h"
USING_NS_CC;    // 使用cocos2d的命名空间

class ImageScene : public Layer{
private:
    
public:
    
    // 重写初始化方法
    virtual bool init();
    
    // 创建scene的操作
    static Scene* createScene();
    
    CREATE_FUNC(ImageScene);    // 使用宏快速创建create方法
};


#endif /* ImageScene_h */

ImageScene.cpp

//
//  ImageScene.cpp
//  Cocos2dFX-mobile
//
//  Created by dzzhyk on 2019/11/14.
//

#include "ImageScene.h"
Scene* ImageScene::createScene(){
    Scene *scene = Scene::create();
    ImageScene *layer = ImageScene::create();
    scene->addChild(layer);
    return scene;
}

bool ImageScene::init(){
    
    Size size = Director::getInstance()->getVisibleSize();
    Sprite *s = Sprite::create("HelloWorld.png");
    s->setPosition(size.width/2, size.height/2);
    addChild(s);
    return true;
}

然后在HelloWorldScene.cpp中引入ImageScene的头文件

#include "ImageScene.h"

最后完成点击事件后onTouchBegin要执行的操作

// 设置其启动一个新的scene
Director::getInstance()->replaceScene(ImageScene::createScene());

编译运行结果如下:

在这里插入图片描述

在编译时可能会遇到下面的问题:
在这里插入图片描述

找不到createScene()方法,这是因为我们没在编译内容里面新加入ImageScene.cpp文件

在项目设置中将其加入编译源即可:

在这里插入图片描述

2. 场景切换效果

通过查阅api文档可知:TransitionScene继承自Scene的子类

可以使用很多继承自TransitionScene的方法来添加场景切换效果,下面使用TransitionFadeTR举例:

只需要将上面的侦听动作函数的内容稍微改变即可:

// 设置其启动一个新的scene
Director::getInstance()
    ->replaceScene(TransitionFadeTR::create(1, ImageScene::createScene()));

其中,前面的数字t代表效果持续的时间,后面的*scene是场景Scene

3. 动作

对一个控件使用runAction()方法来定义其运行的动作

首先,创建一个Label

auto label = Label::createWithSystemFont("内容", "Courier", 20);
label->setPosition(visibleSize.width/2, visibleSize.height/2);
addChild(label);

创建并且绑定事件侦听器

auto listener = EventListenerTouchOneByOne::create();
    listener->onTouchBegan = [label](Touch *t, Event *e){
        if (label->getBoundingBox().containsPoint(t->getLocation())) {
            // 点击事件后进行的操作
        }
        return false;
    };
    Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, label);

加入如下内容:

label->runAction(MoveBy::create(1, Point(10, 10)));

在这里插入图片描述

动作倒放

label->runAction(MoveBy::create(1, Point(10, 10))->reverse());

MoveBy - 以当前位置为参考移动

MoveTo - 以绝对坐标轴为参考移动

4. 重复动作

要将一个动作重复运行就用Repeat::create()将该动作包含起来

原型:

Repeat::create(FiniteTimeAction *action, unsigned int times)

使用:

// 旋转一定角度有限次数
label->runAction(Repeat::create(RotateBy::create(0.5, 180), 3));
// 不停一定角度
label->runAction(RepeatForever::create(RotateBy::create(0.3, 180)));

在这里插入图片描述

原创文章 187 获赞 29 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_43826242/article/details/104133820