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)));