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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不同种海报风格
- 下一篇: Android OpenGL ES视频渲