日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Cocos2d-x 学习笔记(11.1) MoveBy MoveTo

發(fā)布時(shí)間:2024/1/8 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Cocos2d-x 学习笔记(11.1) MoveBy MoveTo 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)

ActionInterval::initWithDuration(duration)); _positionDelta = deltaPosition; _is3D = true;

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。