Follow类是直接继承自Action类的,地位很高啊。
API文档中对于它的作用介绍如下:
Follow is an action that "follows" a node.
还是一贯的言简意赅。
Follow类的Create函数如下:
static Follow* create(Node *followedNode, const Rect& rect = Rect::ZERO);
可以看出在创建Follow动作时,需要传入要跟踪的Node对象和跟踪的范围,范围是一个Rect类型的对象,当Node移动出这个范围后,会停止对其进行跟踪,并且当其再次回到范围中时,跟踪会再次启动。如果范围设置为Rect::ZERO,那么不管该对象移动到哪儿,Follow都会一直对其跟踪。
官方的演示中,有Follow的演示,其中的代码如下:
auto s = Director::getInstance()->getWinSize();
DrawNode* drawNode = DrawNode::create();
float x = s.width*2 - 100;
float y = s.height;
Vec2 vertices[] = { Vec2(5,5), Vec2(x-5,5), Vec2(x-5,y-5), Vec2(5,y-5) };
drawNode->drawPoly(vertices, 4, true, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1));
this->addChild(drawNode);
_grossini->setPosition(-200, s.height / 2);
auto move = MoveBy::create(2, Vec2(s.width * 3, 0));
auto move_back = move->reverse();
auto seq = Sequence::create(move, move_back, nullptr);
auto rep = RepeatForever::create(seq);
_grossini->runAction(rep);
this->runAction(Follow::create(_grossini, Rect(0, 0, s.width * 2 - 100, s.height)));
演示为了表现的更加明白,首先创建了一个边框。然后把精灵的位置放在屏幕的左边,并且让其向屏幕的右边移动。然后创建一个循环,使其一直重复这个动作。
最后创建了一个Follow动作,并且让this执行。这样就完成了Follow动作的创建和执行。
查看Follow类的源码,又有了新的发现,是两个内联函数,定义如下:
inline bool isBoundarySet() const { return _boundarySet; }
inline void setBoundarySet(bool value) { _boundarySet = value; }
可以看出isBoudarySet函数返回一个bool类型的值,来确定当前的Follow对象是否设置了边界,如果边界设置为Rect::ZERO,那么会返回false.如果设置了边界,则会返回true.
setBoundarySet函数乍一看以为是设置边界用的,仔细一看只是用来设置Follow对象是否设置了边界的。
auto fol = Follow::create(sp, Rect(0, 0, visibleSize.width * 2 - 100, visibleSize.height));
fol->setBoudarySet(false);
如果进行这样的设置,isBoudarySet返回false,实际运行中,和直接把边界设置为Rect::ZERO是一样的。
如果先把边界设为Rect::ZERO,在调用setBoudarySet将其设为true.
auto fol = Follow::create(sp, Rect::ZERO);
fol->setBoudarySet(true);
则此运行,isBoudarySet返回true,但是运行会发现,此时并不会对Node对象进行跟踪。