como eu posso usar animação em cocos2d?
-
20-08-2019 - |
Pergunta
Eu estou tentando desenvolver um jogo de roleta para o iPhone. Como posso animação (rotação) da placa Roulette?
Solução
Eu não tenho nenhuma idéia de como fazer isso em cocos2d (ou mesmo o que é isso), mas você pode fazer isso usando Core Animation ou com CALayers ou UIViews. Provavelmente, a maneira mais simples seria criar um UIImageView que contém uma imagem de sua roda de roleta e animar isso.
Para isso, primeiro configure seu UIImageView por inicializando-lo com a sua imagem roleta. Quando você quer a roda para girar, utilize 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 rotatingImage é o seu UIImageView.
Neste exemplo, a roda teria rodar 5 vezes, com cada rotação tendo 0,5 segundos. As rotações são divididos ao meio, porque Core Animation irá para o próximo estado mais próximo, então o máximo que você pode girar algo é uma meia rotação antes de a animação quer girar na outra direção. Ou seja, a rotação pi radiano (180 graus) aqui vai um semi-círculo, mas se você utilizado (1.5f * pi) para o seu ângulo de rotação, seria apenas ir um quarto de círculo. Da mesma forma, se você usou (0.999f * pi), o círculo iria rodar no sentido horário.
Você vai querer implementar aceleração e desaceleração de sua roda, e para aqueles a CAKeyframeAnimation tomaria o lugar do CABasicAnimation neste exemplo.
Outras dicas
É muito simples em Cocos2D:
[sprite runAction:[RotateBy actionWithDuration:dur angle:360]];
para fazer uma volta ou
id action = [RepeatForever actionWithAction: [RotateBy actionWithDuration:dur angle:360]];
[sprite runAction:action];
e
[sprite stopAction:action];
Se você precisa para rodar continuamente.
Não se esqueça de se certificar de que transformAnchor sprite está definido para o centro da imagem. E eu acho próxima pergunta deve surgir - como fazê-lo parar suavemente;)
Mais sobre ações: http: // lethain .com / entry / 2008 / out / 03 / notas-on-cocos2d-iphone-desenvolvimento (é para a versão mais antiga, para que ele usa obsoleta 'fazer' em vez de 'runAction')
Você pode girar uma vista, por algum número de radianos, independentemente de saber se é menos do que uma rotação completa ou muitos múltiplos de uma rotação completa, sem ter que dividir a rotação em pedaços. Como um exemplo, o seguinte código vai girar em vista, uma vez por segundo, para um determinado número de segundos. Você pode facilmente modificá-lo para girar uma vista por um certo número de rotações, ou por algum número 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"];
}
Há um par de maneiras que você pode fazê-lo.
Se você tem a animação quadro-a-quadro para a roda, veja AtlasDemo (parte da distribuição cocos2d).
Caso contrário, dê uma olhada RotateBy do Sprite: método.