Je construis un jeu de concentration. Les tuiles sont returnnées par une pression sur un button. Je vérifie ensuite si deux tuiles sont returnnées. Quand je ne fais pas la vérification, les tuiles se returnnent comme prévu. Quand je fais la vérification, la première tuile returnne correctement. Si la deuxième tuile correspond à la première tuile, parfois la deuxième tuile ne fait pas son animation avant de faire disparaître l'animation.
-(void)twoTilesFlipped { NSInteger i = 0; for (i = 0; i < [bottomLayers count]; i++) { if ([[flippedStatus objectAtIndex:i] isEqualToSsortingng: @"flipped"]) { CALayer *tileOne = [bottomLayers objectAtIndex:i]; NSInteger y = 0; for (y = 0; y < [bottomLayers count]; y++) { if (y == i) { continue; } if ([[flippedStatus objectAtIndex:y] isEqualToSsortingng: @"flipped"]) { CALayer *tileTwo = [bottomLayers objectAtIndex:y]; if (tileOne.contents == tileTwo.contents) { _matchLabel.text = @"It's a match!"; [self disappearTheTiles:tileOne :tileTwo :i :y]; [self isGameOver]; } else { _matchLabel.text = @"Not a match!"; [self flipTheTilesBack:i :y]; } } } return; } }}
Je suis nouveau à la programmation iOS (et la programmation en général (sorte de)).
Oh, voici la méthode pour returnner les carreaux:
- (void)flipTiles:(UIButton *)buttonPressed { int b = buttonPressed.tag; CALayer *top = [topLayers objectAtIndex:b]; CALayer *bot = [bottomLayers objectAtIndex:b]; if ([[flippedStatus objectAtIndex:b] isEqualToSsortingng: @"flipped"]) { top = [bottomLayers objectAtIndex:b]; bot = [topLayers objectAtIndex:b]; } CAAnimation *topAnimation = [self flipAnimationWithDuration:0.75f forLayerBeginningOnTop:YES scaleFactor:0.75f]; CAAnimation *bottomAnimation = [self flipAnimationWithDuration:0.75f forLayerBeginningOnTop:NO scaleFactor:0.75f]; CGFloat zDistance = 1500.0f; CATransform3D perspective = CATransform3DIdentity; perspective.m34 = -1. / zDistance; top.transform = perspective; bot.transform = perspective; topAnimation.delegate = self; [CATransaction begin]; [top addAnimation:topAnimation forKey:@"buttonPressed"]; [bot addAnimation:bottomAnimation forKey:@"buttonPressed"]; [CATransaction commit]; if ([[flippedStatus objectAtIndex:b] isEqualToSsortingng: @"notFlipped"]) { [flippedStatus replaceObjectAtIndex:b withObject:[NSSsortingng ssortingngWithFormat:@"flipped"]]; } else { [flippedStatus replaceObjectAtIndex:b withObject:[NSSsortingng ssortingngWithFormat:@"notFlipped"]]; } //NSLog(@"And if we got here, why didn't it flip? Huh?!");}
Le journal imprime, mais parfois la tuile ne returnne pas avant que l'animation disparaisse.
J'essaie d'être aussi clair que possible, mais je n'arrive pas à comprendre pourquoi cela fonctionne parfois et pas d'autres fois. Je pense que ça a quelque chose à voir avec les loops "for" et les "ifs" nestedes mais je ne comprends pas pourquoi l'animation ne se fait pas d'autant plus que le NSLog se montre toujours dans la console …
J'ai regardé beaucoup de questions liées à l'animation ici et sur d'autres sites – lire un certain nombre de sections d'animation dans des livres et des tutoriels, mais jusqu'à présent, rien ne saute comme une réponse. Je peux, bien sûr, fournir l'set du projet si quelqu'un en a besoin …
J'ai essayé d'append des intervalles de time dans des endroits stratégiques, en vain. J'ai également essayé de suivre l'état returnné des tuiles et cela ne semble pas fonctionner. Existe-t-il un moyen dans -animationDidStop de dire si la seconde tuile a terminé son returnnement? Je suppose que ce que je request est, est-ce qu'il y a un moyen de nommer un CAAnimation (comme il y en a pour UIViewAnimation) afin que je puisse dire si une animation spécifique a été complétée? (Oui il y a – encoding de valeur-key fait l'affaire bien!)
Avec un peu d'aide de Bill, j'ai maintenant commencé le marquage de code des animations. Il s'avère que l'animation joue, mais après la disparition de l'animation – ce qui n'est pas ce dont j'ai besoin. J'ai donc besoin de mettre en place une sorte de vérification pour m'assurer que les deux flips sont arrivés avant de laisser l'animation disparaître. Toutes les pensées ont apprécié!
Après avoir ajouté plus de suivi, il semble que l'animation disparaisse avant l'animation flip – mais seulement parfois. La partie difficile pour moi est de savoir comment dire à l'animation de disparaître seulement après que les deux animations se sont produites. J'y travaille! Suggestions encore encouragées!
J'ai continué à essayer des choses et finalement fait ceci:
-(void)buttonPressed: (UIButton*)buttoni { [self flipTiles:(UIButton *)buttoni]; [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(twoTilesFlipped) userInfo:nil repeats:NO]; }
Au lieu de déblayer d'autres endroits, j'ai mis la timer dans cette méthode et cela semble fonctionner. Bien sûr, quelques autres choses ne fonctionnent pas maintenant, mais je pense que c'est juste en train de peaufiner! Je vous remercie!