Pergunta

Eu estou tentando desenvolver um jogo de roleta para o iPhone. Como posso animação (rotação) da placa Roulette?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top