2011-12-26 53 views
0

我做“猜猜匹配牌”的游戏,那就是:有24卡(的UIImageView)与内部视图中显示的表面隐藏的窗口,他们有12组号码,你摸一个,那么这将是内开秀,找到是否有相同的卡片打开,如果不匹配,则两张打开的卡片将被隐藏。如何让两个视图动画一个接一个地运行?

就在今年。

开卡和隐藏卡动作中使用的UIView动画。但是现在我有一个问题。当我碰到卡时,它会尝试查找是否有匹配。但是开卡和关卡动作同时执行。即使我看不清我看到的卡片内容。

我想开一个卡我摸后,再(甚至等待0.5秒),在同一时间关闭运行结束不匹配卡。不能同时打开卡和关闭卡。但在我的代码中,我先打开了一张卡片,然后计算,然后关闭了两张操作卡。

@interface Card : UIImageView 

@property BOOL expanded; 
@property BOOL found; 
@property (retain)NSString * nameTitle; 
@property (retain) UIImage * expandedImage; 

@end 


// 
// Card.m 
// Guest card match 
// 
// Created by on 11-10-20. 
// Copyright 2011年 __MyCompanyName__. All rights reserved. 
// 

#import "Card.h" 
#import "MainAppDelegate.h" 

@implementation Card 
@synthesize expanded; 
@synthesize found; 
@synthesize expandedImage; 
@synthesize nameTitle; 

- (id)init 
{ 
    if ((self = [super init])) { 
     [self setUserInteractionEnabled:YES]; 
     self.image = [UIImage imageNamed:@"cardface_48.png"]; 
     self.expanded = NO; 
     self.found = NO; 
    } 
    return self; 
} 

- (void)openCard{ 
    NSLog(@"open card"); 
    if (self.expanded){return;} 
    self.expanded = YES; 
    [UIView beginAnimations:@"animation1" context:nil]; 
    [UIView setAnimationDuration:0.8]; 
    [UIView setAnimationDelegate:self]; 

    [UIView setAnimationBeginsFromCurrentState:YES]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self cache:YES]; 
    [self setTransform:CGAffineTransformMakeScale(3.0, 3.0)]; 
    [self setImage:self.expandedImage]; 
    [UIView commitAnimations]; 

    [UIView beginAnimations:@"animation1_open" context:nil]; 
    [UIView setAnimationDuration:1.2]; 
    [UIView setAnimationDelegate:self]; 

    [UIView setAnimationBeginsFromCurrentState:NO]; 
    [self setTransform:CGAffineTransformMakeScale(1, 1)]; 
    [UIView commitAnimations]; 


} 

- (void)closeCard{ 
    if (!self.expanded){return;} 
    self.expanded = NO; 

    [UIView beginAnimations:@"animation1_close" context:nil]; 
    [UIView setAnimationDuration:0.8]; 
    [UIView setAnimationDelegate:self]; 


    [UIView setAnimationBeginsFromCurrentState:YES]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self cache:YES]; 
    [self setTransform:CGAffineTransformMakeScale(3.0, 3.0)]; 
    [self setImage:[UIImage imageNamed:@"cardface_48.png"]]; 
    [UIView commitAnimations]; 

    [UIView beginAnimations:@"animation2_close" context:nil]; 
    [UIView setAnimationDuration:1.2]; 
    [UIView setAnimationDelegate:self]; 


    [UIView setAnimationBeginsFromCurrentState:NO]; 
    [self setTransform:CGAffineTransformMakeScale(1, 1)]; 
    [UIView commitAnimations]; 
    [self setUserInteractionEnabled:YES]; 


} 


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    // Do what you want here 
    //NSLog(@"touchesBegan!"); 
    //[self setUserInteractionEnabled:NO]; 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 

    NSLog(@"card tag: %d", self.tag); 
    if (self.expanded) { 
     return; 
    } 

    [self openCard]; 
    for (NSInteger tagNumber=10001; tagNumber<10025; tagNumber++) { 
     Card *card = (Card *)[self.superview viewWithTag:tagNumber]; 
     if (card.expanded && card.tag != self.tag && !card.found) { 
      if ([card.nameTitle isEqualToString:self.nameTitle]) {// Found match! 
       NSLog(@"Match!"); 
       [card setUserInteractionEnabled:NO]; 
       [self setUserInteractionEnabled:NO]; 
       card.found = YES; 
       self.found = YES; 
      }else{ 
       NSLog(@"not Match!"); 
       [card closeCard]; 
       [self closeCard]; 

      } 
     }else{ 
      [self setUserInteractionEnabled:YES]; 
     } 
    } 


} 

@end 

更新:我跟着Kashiv,而这个更新的代码:

- (void)openCard{ 
    NSLog(@"open card"); 
    if(cardAnimationIsActive) return; 
    cardAnimationIsActive = YES; 


    if (self.expanded){return;} 
    self.expanded = YES; 


    [UIView animateWithDuration:2.0f animations:^{ 


     [UIView beginAnimations:@"animation1" context:nil]; 
     [UIView setAnimationDuration:0.8]; 
     [UIView setAnimationDelegate:self]; 

     [UIView setAnimationBeginsFromCurrentState:YES]; 
     [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self cache:YES]; 
     [self setTransform:CGAffineTransformMakeScale(3.0, 3.0)]; 
     [self setImage:self.expandedImage]; 
     [UIView commitAnimations]; 

     [UIView beginAnimations:@"animation1_open" context:nil]; 
     [UIView setAnimationDuration:1.2]; 
     [UIView setAnimationDelegate:self]; 

     [UIView setAnimationBeginsFromCurrentState:NO]; 
     [self setTransform:CGAffineTransformMakeScale(1, 1)]; 
     [UIView commitAnimations]; 



    } completion:^(BOOL finished){ 
     cardAnimationIsActive = NO; 
    }]; 




} 

- (void)closeCard{ 

    if(cardAnimationIsActive) return; 
    cardAnimationIsActive = YES; 

    if (!self.expanded){return;} 
    self.expanded = NO; 

    [UIView animateWithDuration:5.0f animations:^{ 
     [UIView beginAnimations:@"animation1_close" context:nil]; 
     [UIView setAnimationDuration:0.8]; 
     [UIView setAnimationDelegate:self]; 


     [UIView setAnimationBeginsFromCurrentState:YES]; 
     [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self cache:YES]; 
     [self setTransform:CGAffineTransformMakeScale(3.0, 3.0)]; 
     [self setImage:[UIImage imageNamed:@"android_48.png"]]; 
     [UIView commitAnimations]; 

     [UIView beginAnimations:@"animation2_close" context:nil]; 
     [UIView setAnimationDuration:1.2]; 
     [UIView setAnimationDelegate:self]; 


     [UIView setAnimationBeginsFromCurrentState:NO]; 
     [self setTransform:CGAffineTransformMakeScale(1, 1)]; 
     [UIView commitAnimations]; 
     [self setUserInteractionEnabled:YES]; 
    } completion:^(BOOL finished){ 
     cardAnimationIsActive = NO; 
    }]; 




} 

但opencard和closecard动画仍然在同一时间执行。

回答

0

您可以通过使用基于块的动画达致这:

+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion 

然后你可以检查动画仍在执行或完成BU使用BOOL伊娃(例如cardAnimationIsActive)。

例子:

- (void)openCard { 
    if(cardAnimationIsActive) return; 
    cardAnimationIsActive = YES; 
    [UIView animateWithDuration:duration animations:^{ 
     --- your open animations --- 
    } completion:^(BOOL finished){ 
     cardAnimationIsActive = NO; 
    }]; 
} 

- (void)closeCard { 
    if(cardAnimationIsActive) return; 
    cardAnimationIsActive = YES; 
    [UIView animateWithDuration:duration animations:^{ 
     --- your close animations --- 
    } completion:^(BOOL finished){ 
     cardAnimationIsActive = NO; 
    }]; 
} 
+0

我已经跟着你的指导,opencard和closecard动画仍然同时执行,而不是一个接一个地执行。 – qichunren 2011-12-26 16:20:58

+0

可能的原因是:无论是在公开卡和关卡动画中都有不止一个动画。 – qichunren 2011-12-26 16:31:29

+0

您可以通过将它们放入完成块来创建复杂的动画。 – akashivskyy 2011-12-26 16:35:26

0

你可以使用:

[UIView setAnimationDelay:delay]; 

延迟所有动画正确的时间,让他们按顺序运行。

+0

我想你的意思是在我的“亲密卡”动画添加该代码。但我试过了,开卡和关卡动作仍然同时执行。 – qichunren 2011-12-26 16:12:41

0

[UIView的animateWithDuration:0.2 动画:^ {view.alpha = 0.0;} 完成:^(BOOL完成){[视图removeFromSuperview]; }];

您可以制作完成块第二动画。

相关问题