//mainview.m import "MainView.h" #import #import "TreeAppDelegate.h" #define kFilteringFactor 0.1 #define kEraseAccelerationThreshold 2.0 @implementation MainView #pragma mark Movie Player Routines // Notification called when the movie finished preloading. - (void) moviePreloadDidFinish:(NSNotification*)notification { /* < add your code here > */ } // Notification called when the movie finished playing. - (void) moviePlayBackDidFinish:(NSNotification*)notification { /* < add your code here > For example: MPMoviePlayerController* theMovie=[aNotification object]; etc. */ } // Notification called when the movie scaling mode has changed. - (void) movieScalingModeDidChange:(NSNotification*)notification { /* < add your code here > For example: MPMoviePlayerController* theMovie=[aNotification object]; etc. */ } -(void)initMoviePlayer { /* Because it takes time to load movie files into memory, MPMoviePlayerController automatically begins loading your movie file shortly after you initialize a new instance. When it is done preloading the movie file, it sends the MPMoviePlayerContentPreloadDidFinishNotification notification to any registered observers. If an error occurred during loading, the userInfo dictionary of the notification object contains the error information. If you call the play method before preloading is complete, no notification is sent and your movie begins playing as soon as it is loaded into memory. */ // Register to receive a notification when the movie is in memory and ready to play. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePreloadDidFinish:) name:MPMoviePlayerContentPreloadDidFinishNotification object:nil]; /* Now create a MPMoviePlayerController object using the movie file provided in our bundle. The MPMoviePlayerController class supports any movie or audio files that already play correctly on an iPod or iPhone. For movie files, this typically means files with the extensions .mov, .mp4, .mpv, and .3gp and using one of the following compression standards: - H.264 Baseline Profile Level 3.0 video, up to 640 x 480 at 30 fps. Note that B frames are not supported in the Baseline profile. - MPEG-4 Part 2 video (Simple Profile) If you use this class to play audio files, it displays a black screen while the audio plays. For audio files, this class class supports AAC-LC audio at up to 48 kHz. */ mMoviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[self movieURL]]; /* In addition to the MPMoviePlayerContentPreloadDidFinishNotification notification, the MPMoviePlayerPlaybackDidFinishNotification notification is sent to registered observers when the movie has finished playing, and the MPMoviePlayerScalingModeDidChangeNotification notification is sent when the movie scaling mode has changed. */ // Register to receive a notification when the movie has finished playing. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:mMoviePlayer]; // Register to receive a notification when the movie scaling mode has changed. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieScalingModeDidChange:) name:MPMoviePlayerScalingModeDidChangeNotification object:mMoviePlayer]; /* Set movie player settings (scaling, controller type and background color) to the currently set values as specified in the Settings application */ /* Movie scaling mode can be one of: MPMovieScalingModeNone, MPMovieScalingModeAspectFit, MPMovieScalingModeAspectFill, MPMovieScalingModeFill. */ TreeAppDelegate *appDelegate = (TreeAppDelegate *)[[UIApplication sharedApplication] delegate]; mMoviePlayer.scalingMode = appDelegate.scalingMode; /* Movie control mode can be one of: MPMovieControlModeDefault, MPMovieControlModeVolumeOnly, MPMovieControlModeHidden. */ mMoviePlayer.movieControlMode = appDelegate.controlMode; /* The color of the background area behind the movie can be any UIColor value. */ UIColor *colors[15] = {[UIColor blackColor], [UIColor darkGrayColor], [UIColor lightGrayColor], [UIColor whiteColor], [UIColor grayColor], [UIColor redColor], [UIColor greenColor], [UIColor blueColor], [UIColor cyanColor], [UIColor yellowColor], [UIColor magentaColor],[UIColor orangeColor], [UIColor purpleColor], [UIColor brownColor], [UIColor clearColor]}; mMoviePlayer.backgroundColor = colors[ [appDelegate backgroundColor] ]; } -(IBAction)playMovie:(id)sender { /* As soon as you call the play: method, the player initiates a transition that fades the screen from your current window content to the designated background color of the player. If the movie cannot begin playing immediately, the player object continues displaying the background color and may also display a progress indicator to let the user know the movie is loading. When playback finishes, the player uses another fade effect to transition back to your window content. */ [mMoviePlayer play]; } #pragma mark View Controller Routines // return a URL for the movie file in our bundle -(NSURL *)movieURL { if (mMovieURL == nil) { NSBundle *bundle = [NSBundle mainBundle]; if (bundle) { NSString *moviePath = [bundle pathForResource:@"Hawkeye" ofType:@"m4v"]; if (moviePath) { mMovieURL = [NSURL fileURLWithPath:moviePath]; [mMovieURL retain]; } } } return mMovieURL; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return YES; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview // Low on memory: Release anything that's not essential, such as cached data, or perhaps // unload the movie, etc. } - (void)dealloc { [super dealloc]; [mMovieURL release]; // remove movie notifications [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerContentPreloadDidFinishNotification object:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:mMoviePlayer]; [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerScalingModeDidChangeNotification object:mMoviePlayer]; // free our movie player [mMoviePlayer release]; } -(void)awakeFromNib { NSBundle *mainBundle = [NSBundle mainBundle]; soundEffect = [[SoundEffect alloc] initWithContentsOfFile:[mainBundle pathForResource:@"phone" ofType:@"wav"]]; [UIAccelerometer sharedAccelerometer].delegate = self; [self initMoviePlayer]; } - (void) accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration { UIAccelerationValue length, x, y, z; //Use a basic high-pass filter to remove the influence of the gravity myAccelerometer[0] = acceleration.x * kFilteringFactor + myAccelerometer[0] * (1.0 - kFilteringFactor); myAccelerometer[1] = acceleration.y * kFilteringFactor + myAccelerometer[1] * (1.0 - kFilteringFactor); myAccelerometer[2] = acceleration.z * kFilteringFactor + myAccelerometer[2] * (1.0 - kFilteringFactor); // Compute values for the three axes of the acceleromater x = acceleration.x - myAccelerometer[0]; y = acceleration.y - myAccelerometer[0]; z = acceleration.z - myAccelerometer[0]; //Compute the intensity of the current acceleration length = sqrt(x * x + y * y + z * z); // If above a given threshold, play the erase sounds and erase the drawing view if(length >= kEraseAccelerationThreshold) { AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); [mainView playMovie:self]; } } @end //mainview.h #import #import #import @class SoundEffect; @interface MainView :UIView { UIAccelerationValue myAccelerometer[3]; SoundEffect *soundEffect; MPMoviePlayerController *mMoviePlayer; NSURL *mMovieURL; MainView *mainView; } -(NSURL *)movieURL; -(void)initMoviePlayer; -(IBAction)playMovie:(id)sender; @end