2012-04-07 2 views
0

私は濃度のようなゲームを構築しています。タイルはボタンプレスで反転されます。次に、2つのタイルが反転しているかどうかを確認します。チェックをしないと、タイルが期待どおりに反転します。チェックをすると、最初のタイルが正しく反転します。 2番目のタイルが最初のタイルに一致すると、2番目のタイルはそのフリップアニメーションを行わず、両方ともアニメーションが消滅することがあります。アニメーションが時々発生しない

-(void)twoTilesFlipped { 

NSInteger i = 0; 
for (i = 0; i < [bottomLayers count]; i++) 
{ 
    if ([[flippedStatus objectAtIndex:i] isEqualToString: @"flipped"]) 
    { 
     CALayer *tileOne = [bottomLayers objectAtIndex:i]; 
     NSInteger y = 0; 
     for (y = 0; y < [bottomLayers count]; y++) 
     { 
      if (y == i) 
      { 
       continue; 
      } 

      if ([[flippedStatus objectAtIndex:y] isEqualToString: @"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; 

    } 
}} 

私はiOSプログラミング(および一般的な(並べ替え)のプログラミング)を使い慣れています。

ああ、ここにタイルを反転するための方法である:

- (void)flipTiles:(UIButton *)buttonPressed { 
int b = buttonPressed.tag; 

CALayer *top = [topLayers objectAtIndex:b]; 
CALayer *bot = [bottomLayers objectAtIndex:b]; 

if ([[flippedStatus objectAtIndex:b] isEqualToString: @"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] isEqualToString: @"notFlipped"]) { 
    [flippedStatus replaceObjectAtIndex:b withObject:[NSString stringWithFormat:@"flipped"]]; 
} else { 
    [flippedStatus replaceObjectAtIndex:b withObject:[NSString stringWithFormat:@"notFlipped"]]; 
} 
//NSLog(@"And if we got here, why didn't it flip? Huh?!");} 

ログ版画、まだそれが消えるアニメーションを行う前に、時にはタイルは反転しません。

私はできるだけ明確にしようとしていますが、それが他の時ではなく時々動作する理由について私の心を得ることはできません。私はそれが "for"ループとネストされた "if"と関係があると思いますが、特にNSLogが常にコンソールに表示されるのでアニメーションが起こらない理由を理解できません。

Iここや他のサイトで多くのアニメーション関連の質問を見てきました。本やチュートリアルでアニメーションのセクションを数多く読んでいますが、今のところ答えとして飛び出すことはありません。もし誰もがそれを見て必要があれば、私はもちろん、プロジェクト全体を提供することができます...

私は無駄に、戦略的な場所で時間間隔を追加しようとしました。私はタイルの反転した状態を追跡しようとしましたが、それは動作していないようです。 2番目のタイルがそのフリップを完了したかどうかを知るための方法が-animationDidStopにありますか?私は、特定のアニメーションが完了したかどうかを知るために、(UIViewAnimationのような)CAAnimationの名前を付ける方法はありますか? (はい、あります - キー値コーディングでうまくやっています!)

Billの助けを借りて、私は今アニメーションにタグを付けるキーコードを開始しました。アニメーションは再生されますが、アニメーションが消えた後には、私は何が起こる必要がないかを示します。だから私は、アニメーションが消えるようにする前に両方のフリップが起こったことを確認するために何らかのチェックをする必要があります。どんな考えがありがとう!

さらにトラッキングを追加すると、フリップアニメーションが表示される前にアニメーションが消えているように見えますが、ときどきしか表示されません。私にとって挑戦的な部分は、両方のフリップアニメーションが発生した後にのみ消滅アニメーションが起こるようにする方法を考え出すことです。それに取り組んで!提案はまだ励まされました!

+1

私のアドバイス:ネストされたループを使用する必要がある場合は、何か問題があります。 – CodaFi

+0

それは非常にうまくいくかもしれません、CodaFi - 悲しいことに私の問題を解決しません。私はたぶん何らかの方法で配列を使用することを考えていましたが、まだその道を歩いていませんでした...あなたに助言があればそれは素晴らしいでしょう! –

答えて

0

が、私は物事をしようとして維持し、最終的には、このでした:代わりに他の場所についていじくるの

-(void)buttonPressed: (UIButton*)buttoni 
{ 
    [self flipTiles:(UIButton *)buttoni]; 
    [NSTimer scheduledTimerWithTimeInterval:2.0 
            target:self 
            selector:@selector(twoTilesFlipped) 
            userInfo:nil 
            repeats:NO]; 
} 

を、私はこの方法でタイマーを入れて、動作しているようです。もちろん、他のいくつかのものは現在動作していませんが、ちょうど微調整していると思います!ありがとうございました!

関連する問題