1. 笔记

  1. Cocos2d-x 学习笔记(6) Sprite SpriteFrameCache Texture2D TextureCache
  2. Cocos2d-x 学习笔记(7) 内存管理 Sprite SpriteFrame Texture2D
  3. Cocos2d-x 学习笔记(8) ActionManager
  4. Cocos2d-x 学习笔记(9) Action 运行原理
  5. Cocos2d-x 学习笔记(10) ActionInstant

2. 其他

2.1 使用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,最终坐标又成了相对开始坐标的坐标,不是我们想要的结果。

2.2 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,是条件编译。

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

语句中有下面的变量:

Vec3 _positionDelta; // 我们期望的坐标
Vec3 _startPosition; // 起始坐标
Vec3 _previousPosition; // 本方法上一次setPosition()时的坐标

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

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

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

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!