1. RotateBy RotateTo

两个旋转方法。RotateBy是在当前角度上旋转设置的角度。RotateTo是直接旋转到设置的角度,方向遵循“就近原则”。两者没有相互继承关系。

1.1 成员变量

RotateBy成员变量:

  1. bool _is3D;
  2. Vec3 _deltaAngle; // 设置的角度
  3. Vec3 _startAngle; // 开始的角度

RotateTo成员变量:

  1. bool _is3D;
  2. Vec3 _dstAngle; // 设置的角度
  3. Vec3 _startAngle; // 开始的角度
  4. Vec3 _diffAngle; // 实际旋转的角度

1.2 create

RotateBy:

  1. // initWithDuration方法
  2. ActionInterval::initWithDuration(duration))
  3. _deltaAngle.x = _deltaAngle.y = deltaAngle;

RotateTo:

  1. // initWithDuration方法
  2. ActionInterval::initWithDuration(duration))
  3. _dstAngle.x = dstAngleX;
  4. _dstAngle.y = dstAngleY;

1.3 startWithTarget

RotateBy:

  1. ActionInterval::startWithTarget(target);
  2. if(_is3D)
  3. {
  4. _startAngle = target->getRotation3D();
  5. }
  6. else
  7. {
  8. _startAngle.x = target->getRotationSkewX();
  9. _startAngle.y = target->getRotationSkewY();
  10. }

_startAngle获取了当前的旋转角度。

RotateTo:

  1. if (_is3D)
  2. {
  3. _startAngle = _target->getRotation3D();
  4. }
  5. else
  6. {
  7. _startAngle.x = _target->getRotationSkewX();
  8. _startAngle.y = _target->getRotationSkewY();
  9. }
  10.  
  11. calculateAngles(_startAngle.x, _diffAngle.x, _dstAngle.x);
  12. calculateAngles(_startAngle.y, _diffAngle.y, _dstAngle.y);
  13. calculateAngles(_startAngle.z, _diffAngle.z, _dstAngle.z);

除了获取当前角度,还调用了calculateAngles方法计算_diffAngle。

1.4 "就近原则":RotateTo的calculateAngles方法

首先把开始的角度对正负360度求余:

  1. if (startAngle > )
  2. {
  3. startAngle = fmodf(startAngle, 360.0f);
  4. }
  5. else
  6. {
  7. startAngle = fmodf(startAngle, -360.0f);
  8. }

然后计算diffAngle:

  1. diffAngle = dstAngle - startAngle;

diffAngle要求【-540<=角度<=+540】,否则不遵循就近原则。

diffAngle的值修改成“就近原则”后计算的新值:

  1. if (diffAngle > )
  2. {
  3. diffAngle -= ;
  4. }
  5. if (diffAngle < -)
  6. {
  7. diffAngle += ;
  8. }

1.5 upate

RotateBy,我们设置的_deltaAngle就是旋转的角度:

  1. if (_startAngle.x == _startAngle.y && _deltaAngle.x == _deltaAngle.y)
  2. {
  3. _target->setRotation(_startAngle.x + _deltaAngle.x * time);
  4. }
  5. else
  6. {
  7. _target->setRotationSkewX(_startAngle.x + _deltaAngle.x * time);
  8. _target->setRotationSkewY(_startAngle.y + _deltaAngle.y * time);
  9. }

RotateTo,_diffAngle才是实际旋转的角度:

  1. if (_startAngle.x == _startAngle.y && _diffAngle.x == _diffAngle.y)
  2. {
  3. _target->setRotation(_startAngle.x + _diffAngle.x * time);
  4. }
  5. else
  6. {
  7. _target->setRotationSkewX(_startAngle.x + _diffAngle.x * time);
  8. _target->setRotationSkewY(_startAngle.y + _diffAngle.y * time);
  9. }

Cocos2d-x 学习笔记(11.2) RotateBy RotateTo的更多相关文章

  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. ASP.NET Core 3.0 使用gRPC

    一.简介 gRPC 是一个由Google开源的,跨语言的,高性能的远程过程调用(RPC)框架. gRPC使客户端和服务端应用程序可以透明地进行通信,并简化了连接系统的构建.它使用HTTP/2作为通信协 ...

  2. Rsync 服务部署与参数详解

    Rsync 简介 rsync 是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据同步备份的优秀工具.Rsync软件适用于unix/linux/windows等多种操作系统平台. 传统的 ...

  3. HNU_小初高数学学习软件_功能说明

    结对编程项目主要功能: 1.用户注册功能.用户提供手机号码,点击注册将收到一个注册码,用户可使用该注册码完成注册: 2.用户完成注册后,界面提示设置密码,用户输入两次密码匹配后设置密码成功.密码6-1 ...

  4. Spring MVC-从零开始-EL(未完待续)

    Spring MVC-从零开始-EL(未完待续)

  5. 配置Redis(远程访问及授权设置)

    配置Redis(远程访问及授权设置) 1.将redis.conf里面的bind 127.0.0.1这一行注释掉,添加自己服务器的IP 2. 还有,找到protected-mode这行, 将改为yes. ...

  6. profile文件的错误加载与基本命令间的映射

    一.绪论 [因为这篇心得是原创的,所以如果有哪处总结或者意见不足的地方,欢迎各位大神的批评和意见,共同学习,谢谢了!] 早些时候,需要在centos6.4系统中配置单机版和集群版单节点的hadoop ...

  7. .net core中使用Bumblebee架设微服务网关

    Bumblebee是款基于.net core开发开源的http服务网关,经过最近版本的完善在功能足以满足作为微服务网关的需要.在微服务网关功能中它提供了应用服务负载,故障迁移,安全控制,监控跟踪和日志 ...

  8. jQuery三级联动效果代码(省、市、区)

    很长时间都不用jquery了,有人问我jquery写三级联动的插件我就写好了发出来吧,正好需要的人都可以看看. 一.html代码 <!DOCTYPE html> <html> ...

  9. ouc_software第一次作业:OUC二手物品交易

    一.前言 1.项目名称:ouc二手物品交易 2.项目简介 (1)创办一个网上校内二手物品交易平台,供校内师生进行交易二手物品. (2)经过身份认证的用户,可将自己想要交易的二手物品发布至平台,供其他用 ...

  10. MySQL 深入理解索引B+树存储 (转载))

    出处:http://blog.codinglabs.org/articles/theory-of-mysql-index.html   摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一 ...