五毛的cocos2d-x学习笔记05-场景与场景动画,动作
场景切换函数:
- Director->getInstance()->replaceScene(Scene*);
- Director->getInstance()->runWithScene(Scene*);
两者的区别在于,如果有Scene存在,使用第一个;第一次运行场景,用第二个。
下面是一个切换场景的关键代码。单击文本跳转到下一个场景。要切换到的场景ImageScene继承自Layer,定义了3个成员函数init,createScene,CREATE_FUNC。
ImageScene.h如下:
#ifndef _IMAGESCENE_H_
#define _IMAGESCENE_H_ #include<iostream>
#include<cocos2d.h>
USING_NS_CC; class ImageScene :public Layer{
public:
virtual bool init();
static Scene* createScene();
CREATE_FUNC(ImageScene);
};
#endif
ImageScene.cpp如下:
#include"ImageScene.h"
Scene* ImageScene::createScene(){
Scene *scene = Scene::create();
ImageScene *layer = ImageScene::create();
scene->addChild(layer);
return scene;
}
bool ImageScene::init(){
if (!Layer::init()){
return false;
}
Size size = Director::getInstance()->getVisibleSize();
Sprite *s = Sprite::create("HelloWorld.png");
s->setPosition(size.width/, size.height/);
addChild(s);
return true;
}
关键代码:
bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !Layer::init() )
{
return false;
}
Size visibleSize = Director::getInstance()->getVisibleSize();
Point origin = Director::getInstance()->getVisibleOrigin(); LabelTTF *label = LabelTTF::create("Show Next Scene", "Courier", );
addChild(label); label->setPosition(visibleSize.width/, visibleSize.height/); EventListenerTouchOneByOne *listener = EventListenerTouchOneByOne::create(); listener->onTouchBegan = [label](Touch *t, Event *e){
if (label->getBoundingBox().containsPoint(t->getLocation())){
Director::getInstance()->replaceScene(ImageScene::createScene());
return true;
}
return false;
};
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, label);
return true;
}
运行效果:

场景切换效果能让场景的切换不显得突兀。场景切换效果主要是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", );
label->setPosition(visibleSize.width / , visibleSize.height / );
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(, )));
//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(, Point(, )),
RotateBy::create(, ),
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", );
label->setPosition(visibleSize.width / , visibleSize.height / );
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(, Point(, )),
RotateBy::create(, ),
CallFunc::create([](){
MessageBox("Action Complete", "Complete");
}), NULL)); }
return false;
};
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, label);
return true;
}
五毛的cocos2d-x学习笔记05-场景与场景动画,动作的更多相关文章
- 机器学习实战(Machine Learning in Action)学习笔记————05.Logistic回归
机器学习实战(Machine Learning in Action)学习笔记————05.Logistic回归 关键字:Logistic回归.python.源码解析.测试作者:米仓山下时间:2018- ...
- C++ GUI Qt4学习笔记05
C++ GUI Qt4学习笔记05 qtc++正则表达式 QIntValidator -- 只让用户输入整数 QDoubleValidator -- 只让用户输入浮 ...
- React Native 学习笔记--进阶(二)--动画
React Native 进阶(二)–动画 动画 流畅.有意义的动画对于移动应用用户体验来说是非常必要的.我们可以联合使用两个互补的系统:用于全局的布局动画LayoutAnimation,和用于创建更 ...
- ArcGIS API for JavaScript 4.2学习笔记[21] 对3D场景上的3D要素进行点击查询【Query类学习】
有人问我怎么这个系列没有写自己做的东西呢? 大哥大姐,这是"学习笔记"啊!当然主要以解读和笔记为主咯. 也有人找我要实例代码(不是示例),我表示AJS尚未成熟,现在数据编辑功能才简 ...
- Cocos2d-x 学习笔记(3.1) Scene 场景与场景切换
1. Scene 简介 游戏中我们看到/看不到的所有元素都是展示在场景之Scene上. 我们可以把场景比作放在地上的没盖纸箱,层Layer是纸箱里堆放的玻璃,Sprite等元素画在玻璃Layer上,这 ...
- cocos2d-x实战 C++卷 学习笔记--第6章 场景与层
前言: 一个场景(Scene)是由多个层(Layer)组成,而且层的个数要至少是1,不能为0. 场景切换 场景切换相关函数 1)void runWithScene(Scene* scene) 该函 ...
- [Golang学习笔记] 05 程序实体2 作用域访问权限和变量重声明
作用域访问权限: 程序实体访问权限(作用域)有三种:1. 包级私有(代码包)2. 模块级私有(代码包)3. 公开(全域). 一个函数是一个代码块.一个程序实体的作用域总是会被限制在某个代码块中.好处: ...
- stm32寄存器版学习笔记05 PWM
STM32除TIM6和TIM7外都可以产生PWM输出.高级定时器TIM1和TIM8可以同时产生7路PWM,通用定时器可以产生4路PWM输出. 1.TIM1 CH1输出PWM配置步骤 ①开启TIM1时钟 ...
- [原创]java WEB学习笔记05:Servlet中的ServletConfig对象
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Bash脚本编程学习笔记05:用户交互与脚本调试
用户交互 在<学习笔记04>中我们有提到位置参数,位置参数是用来向脚本传递参数的一种方式.还有一种方式,是read命令. [root@c7-server ~]# read name alo ...
随机推荐
- ortoiseSVN无法编辑日志信息的解决方法
提交时忘记编写日志,想重新编辑日志信息,弹出错误提示: DAV 请求失败:可能是版本库的 pre-revprop-change 钩子执行失败或者不存在 至少有一个属性变更失败:版本库未改变 设置属性 ...
- php错误 mysql_query():supplied argument is not a valid MySQL result resource
出现这种错误,原因是出现该错误的函数的参数出现了问题 参数出现问题有多种情况: 1.sql查询语句有问题,可能多了一个逗号,少了一个逗号,多了括号之类的: 2.与数据库连接的参数有问题,用户名.密码. ...
- ubantu root 默认密码
安装完Ubuntu后忽然意识到没有设置root密码,不知道密码自然就无法进入根用户下.到网上搜了一下,原来是这麽回事.Ubuntu的默认root密码是随机的,即每次开机都有一个新的root密码.我们可 ...
- 组合框里添加复选框的方法(使用勾选的假象,用图片代替而已,并非QT原生支持)
组合框可以看作是列表框和文本框的组合,因其占据的空间少,使用操作方便,常被界面设计人员用于界面开发设计中,在有限个输入的条件下,组合框常用来代替文本框,这样从用户使用角度来看,更趋人性化,所见即所得. ...
- [每日一题] 11gOCP 1z0-052 :2013-09-10 ABOUT ALERTS...............................................A50
转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/11546561 正确答案:AD 使用服务器生成的警报系统,从Oracle10g版本开始,Or ...
- CSS3新动画效果
CSS3添加了几个动画效果的属性,通过设置这些属性,可以做出一些简单的动画效果而不需要再去借助JavaScript.CSS3动画的属性主要分为三类:transform.transition以及anim ...
- HTML5入门(一)
HTML简单介绍: HTML(HyperText Markup Language),超文本标记语言,是一种专门用于创建web的超文本文档编程语言,是我们看到的网页的源代码. 版本简介: 1997年推出 ...
- FMDB 直接将查询结果转化为字典
今天学习FMDB框架,发现非常好用的一点,就是就以把查询结果直接转化为字典 NSString *querySql = @"select * from stuInfo"; NSMut ...
- C#连接Oracle数据库基本类
C#用来连接oracle数据库的基本类: using System; using System.Collections.Generic; using System.Linq; using System ...
- Android ListView 删除动画
Android 的ListView在删除条目时,被删除的条目直接消失,比较生硬,在此实现一下删除动画,大家一起探讨:主要实现原理即是通过Animator来实现被删除条目的动画效果,然后在动画结束时通过 ...