cocos2d-x v3.9 与MoveBy和MoveTo之间的对话
我:能做什么? auto myMoveBy1 = MoveBy::create(1.0f,Vec2(100,0)); // 在1秒内向右平移100像素。
接下来使用我,这时您就相当于告诉了我待移动的物体了, 待移动的物体->runAction(myMoveBy1); “待移动的物体”在cocos2d-x的世界中一般是一个精灵,而您使用精灵也需要创建它。下面是一段完整的代码,您将它放到cocos2d-x工程中就能看到我的表现了。 auto mySprite = Sprite::create("mysprite.png"); // 创建精灵。mysprite.png放在工程的Resources目录下。
mySprite->setPosition(Vec2(100,100)); // 设置精灵的位置。
this->addChild(mySprite); // 将精灵加入Layer。
auto myMoveBy1 = MoveBy::create(1.0f,0)); // 在1秒内向右平移100像素。
mySprite->runAction(myMoveBy1); // 动起来!
我:嗯,看起来不错。来说说你是如何工作的吧。 MoveBy* MoveBy::create(float duration,const Vec2& deltaPosition)
{
return MoveBy::create(duration,Vec3(deltaPosition.x,deltaPosition.y,0)); // z轴填0。
}
接下来将规定的时间上报给我的爹地,那是我的长辈们所关心的事情。 ActionInterval::initWithDuration(duration);
ActionInterval,没错,他就是我的爹地了。最后我会让我的手下_positionDelta记好这个向量。 _positionDelta = deltaPosition;
这样创建阶段就完成了。 void MoveBy::startWithTarget(Node *target) // ActionManager调用了这个函数,告诉了我待移动的物体。
{
ActionInterval::startWithTarget(target); // 上报待移动物体。
_previousPosition = _startPosition = target->getPosition3D(); // 获取待移动物体当前坐标并记录。
}
这样使用阶段也就完成了。 void MoveBy::update(float t) // float t:时间进度百分比。
{
if (_target)
{
#if CC_ENABLE_STACKABLE_ACTIONS
...
#else
/* 不断更新物体的位置。
* 起始位置是_startPosition,规定时间内需要移动_positionDelta。
* 当前过去了百分之多少的规定时间(t),就要移动百分之多少的_positionDelta。
*/
_target->setPosition3D(_startPosition + _positionDelta * t);
#endif // CC_ENABLE_STACKABLE_ACTIONS
}
}
我:我看到有个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; // 本次update()结束,记录将物体移动到的位置。
这样多个动作都做用于物体,每个动作都在不断更新自己的_startPosition,最终物体的移动效果也就是多个动作的组合效果。 auto myMoveBy2 = myMoveBy1->clone();
以及倒立, auto myMoveBy1Reverse = myMoveBy1->reverse();
实现都很简单,之间说了那么多,您现在自己看看源码就会明白了。 我:你有个老爹MoveBy吧,刚才和他聊了很久,你能做的和他的有什么区别? _positionDelta = _endPosition - target->getPosition3D();
具体怎么移动物体就都由我老爹处理了。 MoveTo* MoveTo::reverse() const
{
CCASSERT(false,"reverse() not supported in MoveTo");
return nullptr;
}
因为我在被创建之时不知道要移动哪个物体,所以就不知道物体的起始坐标。这时候让我倒立,我哪知道要从目的地坐标移回到哪里啊。虽然说在runAction()之后我知道了要移动的物体再让我倒立也不是不能够,不过这一会儿能倒立一会儿不能的,可能对于使用上不太友好吧,所以实现者也没有让我那么实现,所以我也就没学倒立了,嘻嘻。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |