Como posso usar animação em cocos2d?

Estou tentando desenvolver um jogo de Roleta para iPhone. Como posso animar (rodar) o tabuleiro da roleta?

Eu não tenho idéia de como fazer isso em cocos2d (ou mesmo o que é), mas você pode fazer isso usando Core Animation com CALayers ou UIViews. Provavelmente a maneira mais simples seria criar um UIImageView contendo uma imagem da sua roleta e animar isso.

Para conseguir isso, primeiro configure seu UIImageView, inicializando-o com sua imagem da roleta. Quando você quiser que a roda gire, use o seguinte código:

CATransform3D rotationTransform = CATransform3DMakeRotation(1.0f * M_PI, 0, 0, 1.0); CABasicAnimation* rotationAnimation; rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; rotationAnimation.toValue = [NSValue valueWithCATransform3D:rotationTransform]; rotationAnimation.duration = 0.25f; rotationAnimation.cumulative = YES; rotationAnimation.repeatCount = 10; [rotatingImage.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 

assumindo que o rotatingImage é o seu UIImageView.

Neste exemplo, a roda giraria 5 vezes, com cada rotação demorando 0,5 segundos. As rotações são divididas ao meio porque o Core Animation irá para o próximo estado mais próximo, então o máximo que você pode rotacionar é uma meia rotação antes que a animação queira girar na outra direção. Isto é, a rotação do pi radiano (180 graus) aqui vai um semicírculo, mas se você usou (1.5f * pi) para o seu ângulo de rotação, ele iria apenas um quarto de círculo. Da mesma forma, se você usou (0,999f * pi), o círculo giraria no sentido horário.

Você desejará implementar a aceleração e desaceleração de sua roda e, para essas, uma CAKeyframeAnimation ocuparia o lugar da CABasicAnimation neste exemplo.

É bem simples no Cocos2D:

 [sprite runAction:[RotateBy actionWithDuration:dur angle:360]]; 

fazer uma volta ou

 id action = [RepeatForever actionWithAction: [RotateBy actionWithDuration:dur angle:360]]; [sprite runAction:action]; 

e

 [sprite stopAction:action]; 

se você precisar girar continuamente.

Não se esqueça de verificar se sprite transformAnchor está configurado para o centro da imagem. E eu acho que a próxima pergunta deve surgir – como fazê-lo parar suavemente;)

Mais sobre ações: http://lethain.com/entry/2008/oct/03/notes-on-cocos2d-iphone-development (é para versão mais antiga, então usa ‘do’ obsoleto em vez de ‘runAction’)

Você pode girar uma vista, por um número de radianos, independentemente de ser menor que uma rotação completa ou vários múltiplos de uma rotação completa, sem precisar dividir a rotação em partes. Como exemplo, o código a seguir girará uma visualização, uma vez por segundo, por um número especificado de segundos. Você pode modificá-lo facilmente para girar uma visualização por um certo número de rotações ou por alguns números de radianos.

 - (void) runSpinAnimationWithDuration:(CGFloat) duration; { CABasicAnimation* rotationAnimation; rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 /* full rotation*/ * rotations * duration ]; rotationAnimation.duration = duration; rotationAnimation.cumulative = YES; rotationAnimation.repeatCount = 1.0; rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; [myView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; } 

Existem algumas maneiras de fazer isso.

Se você tiver a animação quadro a quadro da roda, confira AtlasDemo (parte da distribuição cocos2d).

Caso contrário, dê uma olhada no método RotateBy: Sprite.