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が常にコンソールに表示されるため、特にアニメーションが発生しない理由がわかりません...

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

戦略的な場所に時間間隔を追加しようとしましたが、役に立ちませんでした。また、タイルの反転状態を追跡しようとしましたが、うまくいかないようです。-animationDidStop で、2 番目のタイルがフリップを完了したかどうかを確認する方法はありますか? 私が求めているのは、特定のアニメーションが完了したかどうかを確認できるように、CAAnimation (UIViewAnimation の場合のように) に名前を付ける方法はありますか? (はい、あります - キーと値のコーディングはうまく機能します!)

Bill の助けを借りて、アニメーションにタグ付けするキーコードを開始しました。アニメーションが再生されることが判明しましたが、アニメーションが消えた後 - これは私が起こる必要があるものではありません。そのため、消えるアニメーションを発生させる前に、両方のフリップが発生したことを確認するために、何らかのチェックを行う必要があります。どんな考えでも大歓迎です!

トラッキングを追加した後、フリップ アニメーションの前に消えるアニメーションが発生しているように見えますが、たまにしかありません。私にとって難しいのは、両方のフリップ アニメーションが発生した後にのみ、消えるアニメーションが発生するように指示する方法を見つけることです。取り組んでいます!提案はまだ奨励されています!

4

1 に答える 1

0

私は物事を試し続け、最終的にこれを行いました:

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

他の場所をいじる代わりに、このメソッドにタイマーを入れたところ、うまくいくようです。もちろん、他のいくつかの機能は現在機能していませんが、それは微調整しているだけだと思います! ありがとうございました!

于 2012-05-18T15:51:24.043 に答える