关于Cocos2d-x 3.3中MoveTo和MoveBy的用法

2015年03月17日 09:09 0 点赞 0 评论 更新于 2025-11-21 17:23

在Cocos2d-x 3.3里,MoveToMoveBy这两个动作类可用于实现精灵的移动效果。它们的主要区别在于:MoveTo是将精灵移动到指定的坐标点,而MoveBy则是让精灵从当前坐标点移动指定的距离。

假设精灵当前的坐标为(x, y),为MoveToMoveBy分别指定一个坐标点(x1, y1),那么它们最终的移动效果如下:

  • MoveTo(x, y) → (x1, y1)
  • MoveBy(x, y) → (x + x1, y + y1)

接下来,我们深入了解MoveToMoveBy的继承关系,并详细探讨每个类的接口,同时结合实例进行说明。

MoveBy类详解

成员变量

protected:
Vec2 _positionDelta;    // 偏移坐标,文章开头处说的(x1, y1)就是由它存储的。
Vec2 _startPosition;    // 起始坐标,文章开头处说的(x, y)就是由它存储的。
// 不过这种说法只适用于为一个精灵设置了一个MoveBy动作,
// 如果为同一个精灵设置了多个MoveBy动作,那么这个变量的值也是在不停的改变的,
// 详见下面MoveBy::update()的源码分析。
Vec2 _previousPosition; // 移动过程中的坐标,精灵的移动实际上是在不停的setPosition(),连在一起形成移动效果。
// 这个变量就用于存储上一次setPosition()时的坐标。
private:
CC_DISALLOW_COPY_AND_ASSIGN(MoveBy); // 禁用拷贝构造函数和拷贝赋值操作符。
// 这里用到了C++11标准的新特性“delete函数(= delete)”
// 详情见:http://www.ibm.com/developerworks/cn/aix/library/1212_lufang_c11new/

成员方法

1. static MoveBy* create(float duration, const Vec2& deltaPosition);

此函数用于创建一个MoveBy动作。

  • duration:动作持续的时间。
  • deltaPosition:偏移坐标,这里会给出一对儿(x, y)坐标值,其中x轴左负右正,y轴下负上正。

实例

// 用1秒的时间,向右移动100个像素的MoveBy。
auto myMoveBy = MoveBy::create(1.0f, Vec2(100, 0));
// 用3秒的时间,向上移动500个像素的MoveBy
auto myMoveBy = MoveBy::create(3.0f, Vec2(0, 500));
// 用1秒的时间,向右上移动的MoveBy,具体效果就是x和y轴移动效果的组合。
auto myMoveBy = MoveBy::create(1.0f, Vec2(100, 100));
// 用1秒的时间,向左移动100个像素的MoveBy。
auto myMoveBy = MoveBy::create(1.0f, Vec2(-100, 0));

这里的auto关键字可让编译器自动识别变量类型;createMoveBy的静态成员方法,因此可以通过类名直接调用,无需创建类对象;Vec2是一个管理二维坐标的类。

要让精灵真正动起来,可参考以下代码:

auto mySprite = Sprite::create("mysprite.png");
mySprite->setPosition(Vec2(100, 100));
this->addChild(mySprite);
mySprite->runAction(MoveBy::create(1.0f, Vec2(100, 100)));

注意,mysprite.png需要放在工程的Resources目录下。

实现源码

MoveBy* MoveBy::create(float duration, const Vec2& deltaPosition)
{
MoveBy *ret = new (std::nothrow) MoveBy();    // 创建MoveBy对象。
ret->initWithDuration(duration, deltaPosition);   // 调用内部函数,见下。
ret->autorelease();     // 让该对象在不使用时自动释放。
return ret;
}

bool MoveBy::initWithDuration(float duration, const Vec2& deltaPosition)
{
if (ActionInterval::initWithDuration(duration))    // 动画的持续时间是由其父类负责的。
{
_positionDelta = deltaPosition;    // MoveBy的成员变量存储了偏移坐标。
return true;
}
return false;
}

关键点总结

  • MoveBy::create()可以创建一个MoveBy动作,创建过程中可以指定动作持续时间以及动作具体要向哪个方向(x轴是左负右正,y轴是下负上正)移动多少。
  • MoveBy并没有具体实现运动的过程,它只相当于一个配置。并且配置还进行了细化,其父类负责动画的持续时间,而MoveBy只负责偏移的坐标。

2. virtual MoveBy* clone() const override;

该函数用于克隆一个MoveBy动作。

实例

auto myMoveBy = MoveBy::create(1, Vec2(100, 100));
auto myMoveByClone = myMoveBy->clone();

实现源码

MoveBy* MoveBy::clone() const
{
// no copy constructor
auto a = new (std::nothrow) MoveBy();
a->initWithDuration(_duration, _positionDelta);
a->autorelease();
return a;
}

这里的实现又重新把create()中的内容写了一遍,其实可以直接返回create(),代码如下:

return MoveBy::create(_duration, _positionDelta);

关键点总结

  • MoveBy::clone()就是克隆一个给定的动作,函数名字起得很形象。
  • 源码实现可以更简洁,直接调用MoveBy::create()即可。

3. virtual MoveBy* reverse(void) const override;

使用该函数可以创建一个与原先MoveBy相反的MoveBy动作。

实例

auto myMoveBy = MoveBy::create(1, Vec2(100, 100));
auto reverseMoveBy = myMoveBy->reverse();

通过以上内容,我们详细了解了Cocos2d-x 3.3中MoveBy类的用法,包括成员变量、成员方法以及相关的实现源码和实例。掌握这些知识,你就可以在游戏开发中灵活运用MoveBy动作来实现精灵的移动效果。

作者信息

boke

boke

共发布了 3994 篇文章