Cocos2d-x 学习笔记(11.1) MoveBy MoveTo
1. MoveBy MoveTo
两方法都是对node的平移,MoveBy是相对当前位置的移动。MoveTo是By的子类,是移动到世界坐标位置。
1.1 成员变量和create方法
MoveBy的主要成员变量和create方法主要语句:
bool _is3D;
Vec3 _positionDelta; // 设置的相对起点的终点坐标
Vec3 _startPosition; // 起始坐标
Vec3 _previousPosition; // 上一次setPosition的坐标
ActionInterval::initWithDuration(duration));
_positionDelta = deltaPosition;
_is3D = true;
MoveTo的主要成员变量和create方法主要语句:
Vec3 _endPosition; // 设置的世界坐标系终点坐标
bool _is3D;
Vec3 _positionDelta; // 设置的世界坐标转为相对的坐标
Vec3 _startPosition; // 起始坐标
Vec3 _previousPosition; // 上一次setPosition的坐标 ActionInterval::initWithDuration(duration);
_endPosition = position;
1.2 startWithTarget方法
MoveBy:
ActionInterval::startWithTarget(target);
_previousPosition = _startPosition = target->getPosition3D();
MoveTo:
MoveBy::startWithTarget(target);
_positionDelta = _endPosition - target->getPosition3D();
1.3 update方法
MoveBy update方法主要逻辑:
_target->setPosition3D(_startPosition + _positionDelta * time)
MoveTo的update是父类MoveBy的update。
MoveBy update方法中的CC_ENABLE_STACKABLE_ACTIONS:
#if CC_ENABLE_STACKABLE_ACTIONS
Vec3 currentPos = _target->getPosition3D();
Vec3 diff = currentPos - _previousPosition;
_startPosition = _startPosition + diff;
Vec3 newPos = _startPosition + (_positionDelta * t);
_target->setPosition3D(newPos);
_previousPosition = newPos;
#else
_target->setPosition3D(_startPosition + _positionDelta * t);
#endif
该宏定义默认为1,是条件编译。
条件编译是编译器编译代码时最先处理的部分。如果宏条件符合,编译器就编译这段代码,否则,编译器就忽略这段代码而不编译。
宏定义开启后,当多个动作作用于同一个node时,node的运动方式为多个动作的组合效果。
首先通过当前位置和上一次本动作设置的位置计算偏差量diff,用偏差量重新计算起始坐标,使得node在之前动作的基础上再运动。
如果只有一个动作,偏差量为0,起始坐标不会改变。
1.4 其他
使用MoveTo时,设置Node初始位置与Node的runAction语句先后的关系不同,可能使MoveTo变成MoveBy。
代码如下:
// 错误
MoveTo *myAction = MoveTo::create(5, Vec2(50,50));
sp->runAction(myAction);
sp->setPosition(Vec2(50,50));
this->addChild(tom);
// 正确
MoveTo *myAction = MoveTo::create(5, Vec2(50,50));
sp->setPosition(Vec2(50,50));
sp->runAction(myAction);
this->addChild(tom);
原因在于runAction会调用到MoveBy的startWithTarget:
_positionDelta = _endPosition - target->getPosition3D(); // MoveTo
先runAction再设置初始位置,上面的_endPosition等于_positionDelta,最终坐标又成了相对开始坐标的坐标,不是我们想要的结果。
Cocos2d-x 学习笔记(11.1) MoveBy MoveTo的更多相关文章
- Ext.Net学习笔记11:Ext.Net GridPanel的用法
Ext.Net学习笔记11:Ext.Net GridPanel的用法 GridPanel是用来显示数据的表格,与ASP.NET中的GridView类似. GridPanel用法 直接看代码: < ...
- SQL反模式学习笔记11 限定列的有效值
目标:限定列的有效值,将一列的有效字段值约束在一个固定的集合中.类似于数据字典. 反模式:在列定义上指定可选值 1. 对某一列定义一个检查约束项,这个约束不允许往列中插入或者更新任何会导致约束失败的值 ...
- golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好
golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好 jetbrain家的全套ide都很好用,一定要dark背景风格才装B 从File-->s ...
- Spring MVC 学习笔记11 —— 后端返回json格式数据
Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...
- Python3+Selenium3+webdriver学习笔记11(cookie处理)
#!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记11(cookie处理)'''from selenium im ...
- 并发编程学习笔记(11)----FutureTask的使用及实现
1. Future的使用 Future模式解决的问题是.在实际的运用场景中,可能某一个任务执行起来非常耗时,如果我们线程一直等着该任务执行完成再去执行其他的代码,就会损耗很大的性能,而Future接口 ...
- 《C++ Primer Plus》学习笔记11
<C++ Primer Plus>学习笔记11 第17章 输入.输出和文件 <<<<<<<<<<<<<< ...
- SpringMVC:学习笔记(11)——依赖注入与@Autowired
SpringMVC:学习笔记(11)——依赖注入与@Autowired 使用@Autowired 从Spring2.5开始,它引入了一种全新的依赖注入方式,即通过@Autowired注解.这个注解允许 ...
- Spring 源码学习笔记11——Spring事务
Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...
随机推荐
- Redis相关安装TCL
安装相关命令 wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gzsudo tar -xzvf tcl8.6.1-src.tar. ...
- Redis是否安装
1.Redis对否安装(安装好了会出现下面对应的代码) [lk@localhost /]$ whereis redis-cli redis-cli: /usr/local/bin/redis-cli ...
- 手把手教程: CentOS 6.5 LVS + KeepAlived 搭建 负载均衡 高可用 集群
为了实现服务的高可用和可扩展,在网上找了几天的资料,现在终于配置完毕,现将心得公布处理,希望对和我一样刚入门的菜鸟能有一些帮助. 一.理论知识(原理) 我们不仅要知其然,而且要知其所以然,所以先给大家 ...
- [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher 题解报告
来刷kuangbin字符串了,字符串处理在ACM中是很重要的,一般比赛都会都1——2道有关字符串处理的题目,而且不会很难的那种,大多数时候都是用到一些KMP的性质或者找规律. 点击标题可跳转至VJ比赛 ...
- Java 世界的盘古和女娲 —— Zygote
本文基于 Android 9.0 , 代码仓库地址 : android_9.0.0_r45 文中源码链接: Zygote.java ZygoteInit.java ZygoteServer.java ...
- DeleteFolder
import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; /*** * @author ...
- Java 文章链接
Java表单验证封装类 https://www.cnblogs.com/linjiqin/archive/2013/11/18/3429424.html 微信企业号接入JDK6和JDK7及JDK8加解 ...
- C++——数组与字符串
目录 一.数组 1.1定义与初始化 1.1.1使用 1.1.2存储 1.1.3初始化 1.2作函数参数 1.3对象数组 1.3.1定义与访问 1.3.2初始化 1.3.3数组元素所属类的构造函数 二. ...
- mysql操作遇到的坑(第一版)
1.当我们要统计数据表数量时,如果遇到多表查询,会出现一个主表对应多个子表的维度,我们会用到group by,但是不要再用统计函数去操作数据,因为统计还是会统计原数据 案例 SELECT sum(`o ...
- php常用函数(第一版)
1.array_slice 作用:数组分页函数 案例:$output = array_slice ( $input , - 2 , 1 ); 2.array_column 作用:数组根据值取出一 ...