经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 游戏设计 » 查看文章
Cocos2d-x 学习笔记(11.1) MoveBy MoveTo
来源:cnblogs  作者:深潮  时间:2019/7/29 8:51:45  对本文有异议

1. MoveBy MoveTo

两方法都是对node的平移,MoveBy是相对当前位置的移动。MoveTo是By的子类,是移动到世界坐标位置。

1.1 成员变量和create方法

MoveBy的主要成员变量和create方法主要语句:

bool _is3D; 
Vec3 _positionDelta; // 设置的相对起点的终点坐标
Vec3 _startPosition; // 起始坐标
Vec3 _previousPosition; // 上一次setPosition的坐标

  1. ActionInterval::initWithDuration(duration));
  2. _positionDelta = deltaPosition;
  3. _is3D = true;

MoveTo的主要成员变量和create方法主要语句:

  1. Vec3 _endPosition; // 设置的世界坐标系终点坐标
    bool _is3D; 
    Vec3 _positionDelta; // 设置的世界坐标转为相对的坐标
    Vec3 _startPosition; // 起始坐标
    Vec3 _previousPosition; // 上一次setPosition的坐标

    ActionInterval::initWithDuration(duration);
  2. _endPosition = position;

1.2 startWithTarget方法

MoveBy:

  1. ActionInterval::startWithTarget(target);
    _previousPosition = _startPosition = target->getPosition3D();

MoveTo:

  1. MoveBy::startWithTarget(target);
  2. _positionDelta = _endPosition - target->getPosition3D();

1.3 update方法

MoveBy update方法主要逻辑:

  1. _target->setPosition3D(_startPosition + _positionDelta * time)

MoveTo的update是父类MoveBy的update。

MoveBy update方法中的CC_ENABLE_STACKABLE_ACTIONS:

  1. #if CC_ENABLE_STACKABLE_ACTIONS
  2. Vec3 currentPos = _target->getPosition3D();
  3. Vec3 diff = currentPos - _previousPosition;
  4. _startPosition = _startPosition + diff;
  5. Vec3 newPos = _startPosition + (_positionDelta * t);
  6. _target->setPosition3D(newPos);
  7. _previousPosition = newPos;
  8. #else
  9. _target->setPosition3D(_startPosition + _positionDelta * t);
  10. #endif

该宏定义默认为1,是条件编译。

条件编译是编译器编译代码时最先处理的部分。如果宏条件符合,编译器就编译这段代码,否则,编译器就忽略这段代码而不编译。

宏定义开启后,当多个动作作用于同一个node时,node的运动方式为多个动作的组合效果。

首先通过当前位置和上一次本动作设置的位置计算偏差量diff,用偏差量重新计算起始坐标,使得node在之前动作的基础上再运动。

如果只有一个动作,偏差量为0,起始坐标不会改变。

1.4 其他

使用MoveTo时,设置Node初始位置与Node的runAction语句先后的关系不同,可能使MoveTo变成MoveBy。

代码如下:

  1. // 错误
  2. MoveTo *myAction = MoveTo::create(5, Vec2(50,50));
  3. sp->runAction(myAction);
  4. sp->setPosition(Vec2(50,50));
  5. this->addChild(tom);
  6. // 正确
  7. MoveTo *myAction = MoveTo::create(5, Vec2(50,50));
  8. sp->setPosition(Vec2(50,50));
  9. sp->runAction(myAction);
  10. this->addChild(tom);

原因在于runAction会调用到MoveBy的startWithTarget:

  1. _positionDelta = _endPosition - target->getPosition3D(); // MoveTo

先runAction再设置初始位置,上面的_endPosition等于_positionDelta,最终坐标又成了相对开始坐标的坐标,不是我们想要的结果。 

原文链接:http://www.cnblogs.com/deepcho/p/cocos2dx-action-moveby-moveto.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号