cocos2dx 3D旋转动作
在Cocos2d-x开发中,如何实现“旋转”效果是一个常见的需求。说来惭愧,我最近才发现Cocos2d-x中有OrbitCamera接口(注意,不是RotateTo)。我赶紧到testCpp里查看,果然有这个接口,以前居然一直没注意到!
OrbitCamera接口介绍
OrbitCamera接口的定义如下:
/** creates a OrbitCamera action with radius, delta-radius, z, deltaZ, x, deltaX */
static OrbitCamera* create(float t, float radius, float deltaRadius, float angleZ, float deltaAngleZ, float angleX, float deltaAngleX);
这个接口的参数较多,让人有些头晕。查阅资料后得知,它使用了球坐标。各参数的含义分别是:
t:旋转的时间。radius:起始半径。deltaRadius:半径差。angleZ:起始z角,即从哪个水平角度开始旋转。deltaAngleZ:旋转z角差,也就是图片要旋转的度数,360度为一圈。angleX:起始x角。deltaAngleX:旋转x角差,用于控制竖直方向的旋转。
虽然有了详细的解释,但我还是没有完全理解这些参数的具体作用。于是,我创建了一个小人精灵来进行测试:
auto boy = Sprite::create("boy.png");
boy->setPosition(Point(300, 300));
this->addChild(boy, 2);
boy->runAction(OrbitCamera::create(2.0f, 1, 0, 0, 180, 0, 0));
通过反复更改参数并运行,我逐渐掌握了一些规律:
- 第一个参数
旋转时间很容易理解。 radius起始半径,只要大于0,效果基本相同。deltaRadius半径差,我还没有发现它的具体作用。angleZ起始Z角,决定了水平方向的起始旋转角度。deltaAngleZ旋转Z角差,明确了图片在水平方向的旋转度数。- 起始X角和起始X角差,用于控制竖直方向的旋转。
值得注意的是,这个接口中并没有Y角差相关的参数。个人分析,由于x和y处于一个平面,且该平面垂直于Z轴,所以X和Y方向的旋转效果是一样的。如果您有更深入的见解,欢迎分享!
旋转示例实现
原本我打算实现一个旋转的卡牌效果,这样听起来会更专业,但由于没有合适的卡牌素材(如果您有相关素材,麻烦分享给我),所以我改为实现旋转的小人效果。我们知道,卡牌有正反两面,旋转起来才有效果,因此小人也需要有正反两面。这里,正面使用boy图片,背面使用girl图片。可能有人会吐槽:“boy背面怎么会是girl?”请大家淡定,俗话说“每个成功的男人背后都有一个女人”,所以别多想啦。
具体实现流程如下:
- 创建
boy和girl两个精灵,将它们的初始位置设置为相同,并将girl精灵初始化为隐身状态。让它们同时开始旋转,旋转一圈(360°)的时间为2秒。 - 当
boy旋转到90°(即0.5秒后),将其隐身,同时显示girl精灵。 girl精灵旋转180°(即1秒后),将其隐身,同时显示boy精灵。如此循环。
以下是具体的代码实现:
auto boy = Sprite::create("boy.png");
boy->setPosition(Point(300, 300));
this->addChild(boy, 2);
auto girl = Sprite::create("girl_1.png");
girl->setPosition(Point(300, 300));
girl->setVisible(false); // 一开始设置为不可见
this->addChild(girl, 2);
auto seq1 = Sequence::create(
DelayTime::create(0.5f),
Hide::create(), // 0.5s后隐身
DelayTime::create(1.0f),
Show::create(), // 再过1s后现身
nullptr
);
auto rotate1 = OrbitCamera::create(2.0f, 1, 0, 0, 360, 0, 0);
auto seq2 = Sequence::create(
DelayTime::create(0.5f),
Show::create(), // 0.5s后现身
DelayTime::create(1.0f),
Hide::create(), // 再过1s后隐身
nullptr
);
auto rotate2 = rotate1->clone();
boy->runAction(RepeatForever::create(Spawn::create(rotate1, seq1, nullptr)));
girl->runAction(RepeatForever::create(Spawn::create(rotate2, seq2, nullptr)));
运行上述代码,即可看到小人循环旋转的效果。
Show与Hide接口说明
顺便提一下Show与Hide这两个接口。它们的作用类似于我们熟悉的FadeIn和FadeOut,用于让对象隐身或显示。不同的是,FadeIn和FadeOut需要时间参数,而Show和Hide不需要,使用起来非常方便。
以上就是关于Cocos2d-x 3D旋转动作的介绍,希望对大家有所帮助。