我正在尝试围绕它的Y轴旋转SKSpriteNode节点。我知道有zRotation属性,它将顺时针或逆时针旋转节点;但是,我想围绕它自己的Y轴旋转节点(例如舞蹈芭蕾舞女演员),我似乎无法找到任何功能。这样做的最佳推荐方法是什么?
答案 0 :(得分:6)
通常情况下,如果我想要旋转你似乎在描述的东西,并希望它看起来很好,我会通过描绘不同旋转度的精灵帧来实现。
你可以通过将xScale属性从1补间到-1来伪造它,反之亦然。反之亦然。
xScale技巧对于卡片(或纸质马里奥)是可行的,但对于芭蕾舞女演员而言,并非如此。您正在寻找2D对象的3D旋转,而这不会通过该方法发生。
因此,如果xScale技巧不能满足您的需求,您需要通过精灵帧处理它。
这是一个允许您实现所需旋转的3d SpriteSheet示例:
这个动画gif是用于获得y旋转的精灵帧的一个例子:
答案 1 :(得分:5)
SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
sprite.position = location;
SKAction* action0 = [SKAction scaleXTo:1.0 duration:0.5];
SKAction* action1 = [SKAction scaleXTo:0.1 duration:0.5];
SKAction* action2 = [SKAction scaleXTo:-0.1 duration:0.5];
SKAction* action3 = [SKAction scaleXTo:-1.0 duration:0.5];
SKAction* action = [SKAction sequence:@[action0, action1, action2, action3]];
[sprite runAction:[SKAction repeatActionForever:action]];
[self addChild:sprite];
这会让你看起来像3D卡片翻转,但很明显,如果你期望一个物体有深度,你就不会以缩放的方式得到它。
或者更少的动画(正如LearnCocos2D建议的那样):
SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
sprite.position = location;
SKAction* action0 = [SKAction scaleXTo:1.0 duration:0.5];
SKAction* action1 = [SKAction scaleXTo:-1.0 duration:0.5];
SKAction* action = [SKAction sequence:@[action0, action1]];
[sprite runAction:[SKAction repeatActionForever:action]];
[self addChild:sprite];
答案 2 :(得分:3)
SpriteNode *spriteNode = [SKSpriteNode spriteNodeWithImageNamed@"Sprite"];
spriteNode.position = position;
SKAction *action = [SKAction repeatActionForever:[SKAction customActionWithDuration:duration actionBlock:^(SKNode *node, CGFloat elapsedTime) {
node.xScale = sin(2 * M_PI * elapsedTime / duration);
}]];
[self addChild:spriteNode];
然而,精灵看起来没有厚度。
答案 3 :(得分:1)
虽然SpriteKit没有完整的2.5D功能(沿X,Y和Z轴旋转和变换),但我开发了一种绕X轴或Y轴旋转SKSpriteNodes的方法。因为SKView是UIView的子类,所以我们可以使用CATransform3D以与旋转UIView相同的方式在3D空间中旋转它。
主要观点是需要在Y轴上旋转的精灵存在于自己的场景中,该场景在自己的SKView中呈现。
在循环中触发以下代码将在y轴上为SKView(包含SKScene和SKSpriteNode)设置动画。您仍然可以在后台同时运行主场景并交换需要在y轴上设置动画的精灵,然后在动画完成时将它们交换出来,并移除Y旋转场景。这不是一个漂亮的解决方案,但直到Apple增加了更好的2.5D功能才能实现这一切。
如果您需要更多信息,我已经在SpriteKit和2.5D上编写了一个带示例代码的教程。 http://www.sdkboy.com/?p=283
self.rotAngle -= 10;
float angle = (M_PI / 180.0f) * self.rotAngle/10;
CATransform3D transform3DRotation = CATransform3DMakeRotation(1.0, angle, 0.0, 0.0);
self.mySKView.layer.transform = transform3DRotation;