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的坐标
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_ACTIONSVec3 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,最终坐标又成了相对开始坐标的坐标,不是我们想要的结果。
转载于:https://www.cnblogs.com/deepcho/p/cocos2dx-action-moveby-moveto.html
总结
以上是生活随笔为你收集整理的Cocos2d-x 学习笔记(11.1) MoveBy MoveTo的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 不同种海报风格
- 下一篇: 从头开始训练一个依存分析器