Cocos2d-x 学习笔记(11.1) MoveBy MoveTo
1. MoveBy MoveTo
兩方法都是對(duì)node的平移,MoveBy是相對(duì)當(dāng)前位置的移動(dòng)。MoveTo是By的子類,是移動(dòng)到世界坐標(biāo)位置。
1.1?成員變量和create方法
MoveBy的主要成員變量和create方法主要語(yǔ)句:
bool _is3D;?
Vec3 _positionDelta; // 設(shè)置的相對(duì)起點(diǎn)的終點(diǎn)坐標(biāo)
Vec3 _startPosition; // 起始坐標(biāo)
Vec3 _previousPosition; // 上一次setPosition的坐標(biāo)
MoveTo的主要成員變量和create方法主要語(yǔ)句:
Vec3 _endPosition; // 設(shè)置的世界坐標(biāo)系終點(diǎn)坐標(biāo)bool _is3D;?
Vec3 _positionDelta; // 設(shè)置的世界坐標(biāo)轉(zhuǎn)為相對(duì)的坐標(biāo)
Vec3 _startPosition; // 起始坐標(biāo)
Vec3 _previousPosition; // 上一次setPosition的坐標(biāo)
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該宏定義默認(rèn)為1,是條件編譯。
條件編譯是編譯器編譯代碼時(shí)最先處理的部分。如果宏條件符合,編譯器就編譯這段代碼,否則,編譯器就忽略這段代碼而不編譯。
宏定義開啟后,當(dāng)多個(gè)動(dòng)作作用于同一個(gè)node時(shí),node的運(yùn)動(dòng)方式為多個(gè)動(dòng)作的組合效果。
首先通過當(dāng)前位置和上一次本動(dòng)作設(shè)置的位置計(jì)算偏差量diff,用偏差量重新計(jì)算起始坐標(biāo),使得node在之前動(dòng)作的基礎(chǔ)上再運(yùn)動(dòng)。
如果只有一個(gè)動(dòng)作,偏差量為0,起始坐標(biāo)不會(huì)改變。
1.4 其他
使用MoveTo時(shí),設(shè)置Node初始位置與Node的runAction語(yǔ)句先后的關(guān)系不同,可能使MoveTo變成MoveBy。
代碼如下:
// 錯(cuò)誤 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會(huì)調(diào)用到MoveBy的startWithTarget:
_positionDelta = _endPosition - target->getPosition3D(); // MoveTo先runAction再設(shè)置初始位置,上面的_endPosition等于_positionDelta,最終坐標(biāo)又成了相對(duì)開始坐標(biāo)的坐標(biāo),不是我們想要的結(jié)果。?
轉(zhuǎn)載于:https://www.cnblogs.com/deepcho/p/cocos2dx-action-moveby-moveto.html
總結(jié)
以上是生活随笔為你收集整理的Cocos2d-x 学习笔记(11.1) MoveBy MoveTo的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不同种海报风格
- 下一篇: 从头开始训练一个依存分析器