2013-11-21 2 views
9

Я пытаюсь повернуть узел SKSpriteNode вокруг оси Y. Я знаю, что есть свойство zRotation и которое будет вращать узел по часовой стрелке или против часовой стрелки; однако, я бы хотел повернуть узел вокруг собственной оси Y (например, танцевальная балерина), и я не могу найти никаких функций для этого. Каков наилучший рекомендуемый способ сделать это?Как повернуть SKSpriteNode вокруг оси Y узла?

+0

Это называется анимацией или 3D. Вы не можете делать 3D в 2D-среде. –

+0

Она стоит.очевидно, если бы это был вид сверху вниз, то zRotation будет работать. – marina

+1

попробуйте изменить xScale с 1.0 до -1.0, это самый близкий к вращению 3D-типа – LearnCocos2D

ответ

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]; 
6

Обычно, если я хотел повернуть что-то, как вы, кажется, с описанием, и хотите, чтобы хорошо выглядеть, я буду делать это с помощью спрайтов кадров изображающие разные степени вращения.

Возможно, вы можете немного подделать его, изменив свойство xScale с 1 на -1 и наоборот.

Уловка xScale возможна для карт, возможно, (или бумажного марио), но для балерины не так много. Вы ищете 3D-поворот 2D-объекта, и это не произойдет с помощью этого метода.

Так что если трюк xScale не подходит для ваших нужд, вам нужно будет обработать его через кадры спрайтов.

Вот пример 3d SpriteSheet, что позволит вам достичь поворота вы хотите:

enter image description here

Этот анимированный GIF является примером спрайтов кадров, чтобы получить что у поворота:

enter image description here

1

Хотя SpriteKit не имеет полных возможностей 2.5D (вращается и преобразуется вдоль осей X, Y и Z), я разработал работу для вращения SKSpriteNodes aroun d либо оси X, либо Y. Поскольку SKView является подклассом UIView, мы можем вращать его в трехмерном пространстве так же, как мы поворачиваем UIView, используя CATransform3D.

Главное, что спрайт, который должен быть повернут по оси Y, живет в своей собственной сцене, которая представлена ​​в собственном SKView.

Запуск следующего кода в цикле приведет к анимации вашего SKView (содержащего SKScene и SKSpriteNode) по оси y. Вы по-прежнему можете использовать свою основную сцену в фоновом режиме и заменять спрайты, которые должны быть анимированы на оси 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; 
2
SpriteNode *spriteNode = [SKSpriteNode [email protected]"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]; 

Однако, спрайт выглядит как не имеющая толщины.

 Смежные вопросы

  • Нет связанных вопросов^_^