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的更多相关文章

  1. Ext.Net学习笔记11:Ext.Net GridPanel的用法

    Ext.Net学习笔记11:Ext.Net GridPanel的用法 GridPanel是用来显示数据的表格,与ASP.NET中的GridView类似. GridPanel用法 直接看代码: < ...

  2. SQL反模式学习笔记11 限定列的有效值

    目标:限定列的有效值,将一列的有效字段值约束在一个固定的集合中.类似于数据字典. 反模式:在列定义上指定可选值 1. 对某一列定义一个检查约束项,这个约束不允许往列中插入或者更新任何会导致约束失败的值 ...

  3. golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好

    golang学习笔记11   golang要用jetbrain的golang这个IDE工具开发才好  jetbrain家的全套ide都很好用,一定要dark背景风格才装B   从File-->s ...

  4. Spring MVC 学习笔记11 —— 后端返回json格式数据

    Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...

  5. Python3+Selenium3+webdriver学习笔记11(cookie处理)

    #!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记11(cookie处理)'''from selenium im ...

  6. 并发编程学习笔记(11)----FutureTask的使用及实现

    1. Future的使用 Future模式解决的问题是.在实际的运用场景中,可能某一个任务执行起来非常耗时,如果我们线程一直等着该任务执行完成再去执行其他的代码,就会损耗很大的性能,而Future接口 ...

  7. 《C++ Primer Plus》学习笔记11

    <C++ Primer Plus>学习笔记11 第17章 输入.输出和文件 <<<<<<<<<<<<<< ...

  8. SpringMVC:学习笔记(11)——依赖注入与@Autowired

    SpringMVC:学习笔记(11)——依赖注入与@Autowired 使用@Autowired 从Spring2.5开始,它引入了一种全新的依赖注入方式,即通过@Autowired注解.这个注解允许 ...

  9. Spring 源码学习笔记11——Spring事务

    Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...

随机推荐

  1. 来几道水题 d050: 妳那裡現在幾點了?

    减去15即可(注意这个数小于15的情况) 题目:珊珊到了美国犹他州的杨百翰大学之后,文文禁不住对她的思念,常常想打电话给她,却又担心在美国的她是不是在睡觉.好不容易鼓起勇气打通了电话,第一句就先问:「 ...

  2. rabbitmq+haproxy+keepalived高可用集群环境搭建

    1.先安装centos扩展源: # yum -y install epel-release 2.安装erlang运行环境以及rabbitmq # yum install erlang ... # yu ...

  3. JS权威指南需要注意的知识点(1-6章)

    客官快来看一看了,都给你浓缩好了,确定不进来搂一眼嘛,走过路过不要错过哟 in运算符 in运算符希望它的左操作数是一个字符串或可以转化为字符串,希望它的右操作数是一个对象,如果右侧的对象拥有一个名为左 ...

  4. MySQL优化之索引原理(二)

    一,前言 ​ 上一篇内容说到了MySQL存储引擎的相关内容,及数据类型的选择优化.下面再来说说索引的内容,包括对B-Tree和B+Tree两者的区别. 1.1,什么是索引 ​ 索引是存储引擎用于快速找 ...

  5. Swoole入门到实战 打造高性能 赛事直播平台(完整版)

    Thinkphp+Swoole入门到实战打造高性能赛事直播平台 第1章 课程介绍 欢迎大家来到swoole的课程!本章主要是介绍了swoole的一些特性,以及使用场景,并且分享了swoole在其他公司 ...

  6. rpm方式升级cenos6.7内核

    最近因为yarn集群问题需要配置cgroup.但是配置完成后操作系统内核奔溃. 查找资料后发现升级内核可以解决问题.在领导的大力支持下,对生产环境的计算节点(nodemanager)进行了批量升级内核 ...

  7. 导出wordpress数据库Fatal error: Cannot 'break' 2 levels

    今天我打算备份一下我在Linux下用宝塔面板搭建的phpmyadmin导出wordpress数据库.选择数据库后给我一个Fatal error: Cannot 'break' 2 levels in ...

  8. volatile 关键字的作用

    简介Java 语言提供了一种稍弱的同步机制,即 volatile 变量,用来确保将变量的更新操作通知到其他线程.volatile 变量具备两种特性:变量可见性.禁止重排序. 作为同步锁在访问 vola ...

  9. Tornado基础学习篇

    1.1 Tornado是什么? Tornado是使用Python编写的一个强大的.可扩展的Web服务器.它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应 ...

  10. pywintypes.com_error: (-2147352567, '发生意外 解决方案

    在使用win32com处理Excel的时候,遇到pywintypes.com_error: (-2147352567 错误. 百度.Google各种方法不得其解,和以下网页类似——http://blo ...