views:

35

answers:

1

Im developing a memory game. As i click on a button I want the background to switch. When I click on the card the second time i want the background to switch for a second and then go back to the original (if it wasnt the correct card). But the background of the buttons are not changed until i return from the method (buttonPressed). Why isnt it changed instantly? Please help me! :)

Here is the class that i am working with:

#import "Button.h"
#import <UIKit/UIKit.h>
#import <AVFoundation/AVAudioPlayer.h>

@class ZogajAppDelegate;

@interface PairPlayPlayViewController : UIViewController <AVAudioPlayerDelegate> {
    ZogajAppDelegate *appDelegate;
    AVAudioPlayer *av;
    Boolean isPairActive;
    Button *firstButton;
    Button *secondButton;

}
@property (nonatomic, retain) AVAudioPlayer *av;
@property (nonatomic, retain) Button *firstButton;
@property (nonatomic, retain) Button *secondButton;
- (void)buttonPressed:(id)sender;
- (void)secondCard;

@end

and the .m file:

#import "PairPlayPlayViewController.h"
#import "ZogajAppDelegate.h"
#import "Button.h"
#import "AVFoundation/AVAudioPlayer.h"



@implementation PairPlayPlayViewController
@synthesize av, firstButton, secondButton;

/*
 // The designated initializer.  Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
        // Custom initialization
    }
    return self;
}
*/


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];

    NSString *newAudioFile = [[NSBundle mainBundle] pathForResource:@"double_card" ofType:@"mp3"];
    NSString *newAudioFile2 = [[NSBundle mainBundle] pathForResource:@"right_sound" ofType:@"mp3"];

    av = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:newAudioFile] error:NULL];
    [av prepareToPlay];
    [av initWithContentsOfURL:[NSURL fileURLWithPath:newAudioFile2] error:NULL];
    [av prepareToPlay];
    //av = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:newAudioFile] error:NULL];
    //[av prepareToPlay];
    isPairActive = FALSE;


    appDelegate = (ZogajAppDelegate *)[[UIApplication sharedApplication] delegate];
    int position;

    for(int i = 0; i < ((appDelegate.numberOfPairs*2)/5); i++){

        for (int j = 0; j<5 ;j++){


            Button *button = [[Button alloc] init];

            //Sätter bild nummer..
            position = (arc4random() % [appDelegate.cardsInPlay count]);
            button.picNumber = [[appDelegate.cardsInPlay objectAtIndex:position]intValue];
                        NSLog(@"%d", button.picNumber);
            [appDelegate.cardsInPlay removeObjectAtIndex:position];

            button.frame = CGRectMake( 3 + (65 * j), 5 + (65 * i), 55, 55);
            button.imageView.contentMode = UIViewContentModeScaleAspectFit;
            button.imageView.clipsToBounds = YES;
            [button setBackgroundImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal];
            [button addTarget:self action:@selector(buttonPressed:)
             forControlEvents:UIControlEventTouchUpInside];
            [self.view addSubview:button];
        }
    }
    for (int j = 0; j<((appDelegate.numberOfPairs*2) % 5) ;j++){


        Button *button = [[Button alloc] init];

        //Sätter bild nummer..
        position = (arc4random() % [appDelegate.cardsInPlay count]);
        button.picNumber = [[appDelegate.cardsInPlay objectAtIndex:position]intValue];
        NSLog(@"%d", button.picNumber);
        [appDelegate.cardsInPlay removeObjectAtIndex:position];

        button.frame = CGRectMake( 3 + (65 * j), 5 + (65 * ((appDelegate.numberOfPairs*2)/5) + 1), 55, 55);
        //button.imageView.contentMode = UIViewContentModeScaleAspectFit;
        //button.imageView.clipsToBounds = YES;
        [button setBackgroundImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal];
        [button addTarget:self action:@selector(buttonPressed:)
         forControlEvents:UIControlEventAllTouchEvents];

        [self.view addSubview:button];
    }
}


/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/

-(void)buttonPressed:(id)sender {
    Button *button = [[Button alloc] init];
    button = sender;
    NSLog(@"%d och spela upp ljud", button.picNumber);
    NSString *newAudioFile = [[NSBundle mainBundle] pathForResource:@"double_card" ofType:@"mp3"];
    [av initWithContentsOfURL:[NSURL fileURLWithPath:newAudioFile] error:NULL];
    [av play];
    [button setBackgroundImage:[UIImage imageNamed:[NSString stringWithFormat:@"%d.png",button.picNumber]] forState:UIControlStateNormal];
    [self.view addSubview:button];
    [NSThread sleepForTimeInterval:1.0];

    if(isPairActive == FALSE){
        isPairActive = TRUE;
        firstButton = button;
    }
    else {
        secondButton = button;
        [self secondCard];
    }

    return;
}

- (void)secondCard {
    [NSThread sleepForTimeInterval:1.0];
    NSString *newAudioFile = [[NSBundle mainBundle] pathForResource:@"double_card" ofType:@"mp3"];
    isPairActive = FALSE;
    if([appDelegate.dictionary objectForKey:[NSString stringWithFormat:@"%d",secondButton.picNumber]] == [NSString stringWithFormat:@"%d",firstButton.picNumber]){
        NSString *newAudioFile2 = [[NSBundle mainBundle] pathForResource:@"right_sound" ofType:@"mp3"];
        [av initWithContentsOfURL:[NSURL fileURLWithPath:newAudioFile2] error:NULL];
        [av play];
    }
    else {
        [firstButton setBackgroundImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal];
        [secondButton setBackgroundImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal];
        [av initWithContentsOfURL:[NSURL fileURLWithPath:newAudioFile] error:NULL];
        [av play];
    }
    return;
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [super dealloc];
    [av release];
    [firstButton release];
    [secondButton release];
}


@end
+1  A: 

In buttonPressed: change the background, set an NSTimer to call you back, and return. In the NSTimer callback, set the background back to what you want.

Drawing doesn't happen at the moment you ask for it. That would give you horrible performance. All drawing is merged into the draw portion of the run loop. You won't get to that portion until you return from this IBAction method.

Rob Napier