2013-10-15 2 views
16

Я делаю игру, и у меня возникают проблемы с поворотным узлом спрайта, Это код, который у меня есть; Что я должен добавить, чтобы включить его, скажем, 45 градусов ?.Как повернуть узел спрайта в комплекте спрайтов?

SKSpriteNode *platform = [SKSpriteNode spriteNodeWithImageNamed:@"YellowPlatform.png"]; 
platform.position = CGPointMake(CGRectGetMidX(self.frame), -200+CGRectGetMidY(self.frame)); 
platform.size = CGSizeMake(180, 10); 
platform.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:platform.size]; 
platform.physicsBody.dynamic = NO; 
[self addChild:platform]; 
+3

Это было очень просто: просто добавьте следующую строку кода: platform.zRotation = M_PI/4.0; bye – Vince

ответ

18

Вы делаете SKAction для вращения и запускаете это действие на узле. , например:

//M_PI/4.0 is 45 degrees, you can make duration different from 0 if you want to show the rotation, if it is 0 it will rotate instantly 
SKAction *rotation = [SKAction rotateByAngle: M_PI/4.0 duration:0]; 
//and just run the action 
[yourNode runAction: rotation]; 
59

Просто сделать это без использования действий:

sprite.zRotation = M_PI/4.0f; 
+2

Это должен быть принятый ответ. Нет необходимости запускать действие с нулевой продолжительностью только для поворота спрайта. –

14

Используя заданное значение будет быстрее:

sprite.zRotation = M_PI_4; 

Эти предопределенные константы в math.h доступны как литералы и могут использоваться для уменьшения фактической обработки таких значений, как M_PI/4.0

+1

Глупости. Это приведет к тому же скомпилированному коду и займет одно и то же время (разница будет неизмеримой). Сказав это, нет оснований не использовать 'M_PI_4'. – trojanfoe

+0

О, спасибо, что расчистили это. Я не знал, что M_PI/4 будет предварительно скомпилирован, чтобы отразить то же значение, что и M_PI_4. – ZeMoon

14
sprite.zRotation = M_PI_4; 

и

[sprite runAction:[SKAction rotateByAngle:M_PI_4 duration:0]]; 

не то же самое.

Эксплуатация SKAction будет анимировать изменение, даже если продолжительность равна 0, он сделает это за очень короткое время. изменение zRotation покажет его при новом вращении.

Почему это важно: если вы добавите новый спрайт, выполняющий на нем [SKAction rotateByAngle:] создаст мерцание/уродство в спрайте по мере его появления.

Если спрайт находится на экране, и вы хотите повернуть его, изменение zRotation будет не таким приятным, как rotatebyAngle: даже с длительностью 0.

+1

Это важное различие. – JaredH

3

В Swift 2, как я получил мое, чтобы повернуть был

   sprite.zRotation = CGFloat(M_PI/2.0) //90 degrees 
       sprite.zRotation = CGFloat(M_PI/4.0) //45 degrees 
2
//rotates player node 90 degrees 
player.zRotation = CGFloat(M_PI_2)*3; 
//rotates 180 degrees 
player.zRotation = CGFloat(M_PI_2)*2; 
//rotates 270 degrees 
player.zRotation = CGFloat(M_PI_2)*1; 
//rotates 360 degrees (where it was originally) 
player.zRotation = CGFloat(M_PI_2)*4; 
//rotates 315 degrees 
player.zRotation = (CGFloat(M_PI_2)*1)/2; 
and so on... 
+0

добавьте более подробную информацию к вашему ответу –

3

Для СВИФТ 3/SWIFT 4 версии вы можете использовать следующий:

sprite.zRotation = CGFloat(Double.pi/4) 

или, если хотите действия:

let rotateAction = SKAction.rotate(toAngle: CGFloat(Double.pi/4), duration: 0) 
sprite.run(rotateAction)