From 405df8bd15d278fe0d331d53db968d9e8d2423c7 Mon Sep 17 00:00:00 2001 From: "techdragon.nguyen@gmail.com" Date: Thu, 12 Apr 2012 11:53:42 +0000 Subject: [PATCH] refactored gesture recognition for iOS --- JGE/src/iOS/EAGLView.m | 197 +++++++++++++++++++++++++---------------- 1 file changed, 120 insertions(+), 77 deletions(-) diff --git a/JGE/src/iOS/EAGLView.m b/JGE/src/iOS/EAGLView.m index 685b540d2..1dfbd10c4 100755 --- a/JGE/src/iOS/EAGLView.m +++ b/JGE/src/iOS/EAGLView.m @@ -99,73 +99,68 @@ static NSString *_MY_AD_WHIRL_APPLICATION_KEY_IPAD = @"2e70e3f3da40408588b9a3170 - (void) initGestureRecognizers { - UIGestureRecognizer *recognizer; - - /* - Create a 3 fingers left swipe gesture recognizer to handle left trigger operations - */ - UISwipeGestureRecognizer *threeFingerSwipeLeftRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleNextPhase:)]; - threeFingerSwipeLeftRecognizer.direction = UISwipeGestureRecognizerDirectionLeft; - threeFingerSwipeLeftRecognizer.numberOfTouchesRequired = 3; + UISwipeGestureRecognizer *threeFingerSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(mapDirectionalPad:)]; + threeFingerSwipe.numberOfTouchesRequired = 3; + threeFingerSwipe.direction = UISwipeGestureRecognizerDirectionRight; + [self addGestureRecognizer:threeFingerSwipe]; + [threeFingerSwipe release]; - [self addGestureRecognizer: threeFingerSwipeLeftRecognizer]; - [threeFingerSwipeLeftRecognizer release]; + UISwipeGestureRecognizer *swipeRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(mapActionButtons:)]; - /* - Create a 3 fingers right swipe gesture recognizer to handle opening and closing of hand. (right trigger) - */ - UISwipeGestureRecognizer *threeFingerSwipeRightRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleHand:)]; - threeFingerSwipeRightRecognizer.direction = UISwipeGestureRecognizerDirectionRight; - threeFingerSwipeRightRecognizer.numberOfTouchesRequired = 3; + swipeRecognizer.numberOfTouchesRequired = 2; + [swipeRecognizer setDirection:UISwipeGestureRecognizerDirectionRight]; + [self addGestureRecognizer: swipeRecognizer]; + [swipeRecognizer requireGestureRecognizerToFail: threeFingerSwipe]; + [swipeRecognizer release]; + - [self addGestureRecognizer: threeFingerSwipeRightRecognizer]; - [threeFingerSwipeRightRecognizer release]; + threeFingerSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(mapDirectionalPad:)]; + threeFingerSwipe.numberOfTouchesRequired = 3; + threeFingerSwipe.direction = UISwipeGestureRecognizerDirectionLeft; + [self addGestureRecognizer:threeFingerSwipe]; + [threeFingerSwipe release]; - /* - Create a 2 fingers left swipe gesture recognizer to handle interruption. (square key) - */ - recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleInterrupt:)]; - ((UISwipeGestureRecognizer*)recognizer).direction = UISwipeGestureRecognizerDirectionLeft; - ((UISwipeGestureRecognizer*)recognizer).numberOfTouchesRequired = 2; - [self addGestureRecognizer:recognizer]; - [recognizer requireGestureRecognizerToFail: threeFingerSwipeLeftRecognizer]; - [recognizer release]; + swipeRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(mapActionButtons:)]; + swipeRecognizer.numberOfTouchesRequired = 2; + [swipeRecognizer setDirection:UISwipeGestureRecognizerDirectionLeft]; + [self addGestureRecognizer: swipeRecognizer]; + [swipeRecognizer requireGestureRecognizerToFail: threeFingerSwipe]; + [swipeRecognizer release]; + + threeFingerSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(mapDirectionalPad:)]; + threeFingerSwipe.numberOfTouchesRequired = 3; + threeFingerSwipe.direction = UISwipeGestureRecognizerDirectionUp; + [self addGestureRecognizer:threeFingerSwipe]; + [threeFingerSwipe release]; - /* - Create a 2 fingers right swipe gesture recognizer. (circle key) - */ - recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSecondary:)]; - ((UISwipeGestureRecognizer*)recognizer).direction = UISwipeGestureRecognizerDirectionRight; - ((UISwipeGestureRecognizer*)recognizer).numberOfTouchesRequired = 2; - [self addGestureRecognizer:recognizer]; - [recognizer requireGestureRecognizerToFail: threeFingerSwipeRightRecognizer]; - [recognizer release]; + swipeRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(mapActionButtons:)]; + swipeRecognizer.numberOfTouchesRequired = 2; + [swipeRecognizer setDirection:UISwipeGestureRecognizerDirectionUp]; + [self addGestureRecognizer: swipeRecognizer]; + [swipeRecognizer requireGestureRecognizerToFail: threeFingerSwipe]; + [swipeRecognizer release]; + - /* - Create a 2 fingers down swipe gesture recognizer to handle interruption. (cross key) - */ - recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleOK:)]; - ((UISwipeGestureRecognizer*)recognizer).direction = UISwipeGestureRecognizerDirectionDown; - ((UISwipeGestureRecognizer*)recognizer).numberOfTouchesRequired = 2; - [self addGestureRecognizer:recognizer]; - [recognizer release]; + threeFingerSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(mapDirectionalPad:)]; + threeFingerSwipe.numberOfTouchesRequired = 3; + threeFingerSwipe.direction = UISwipeGestureRecognizerDirectionDown; + [self addGestureRecognizer:threeFingerSwipe]; + [threeFingerSwipe release]; + swipeRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(mapActionButtons:)]; - /* - Create a 2 fingers up swipe gesture recognizer. (triangle key) - */ - recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleCancel:)]; - ((UISwipeGestureRecognizer*)recognizer).direction = UISwipeGestureRecognizerDirectionUp; - ((UISwipeGestureRecognizer*)recognizer).numberOfTouchesRequired = 2; - [self addGestureRecognizer:recognizer]; - [recognizer release]; + swipeRecognizer.numberOfTouchesRequired = 2; + [swipeRecognizer setDirection:UISwipeGestureRecognizerDirectionDown]; + [self addGestureRecognizer: swipeRecognizer]; + [swipeRecognizer requireGestureRecognizerToFail: threeFingerSwipe]; + [swipeRecognizer release]; /* Create a recognizer for the select key functionality */ UILongPressGestureRecognizer *selectKeyRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleSelectKey:)]; - selectKeyRecognizer.minimumPressDuration =2; + selectKeyRecognizer.minimumPressDuration = 2; selectKeyRecognizer.numberOfTouchesRequired = 2; [self addGestureRecognizer:selectKeyRecognizer]; @@ -178,6 +173,11 @@ static NSString *_MY_AD_WHIRL_APPLICATION_KEY_IPAD = @"2e70e3f3da40408588b9a3170 [menuKeyRecognizer requireGestureRecognizerToFail: selectKeyRecognizer]; [self addGestureRecognizer:menuKeyRecognizer]; + /* + UIPinchGestureRecognizer *pinchZoomRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchZoom:)]; + [self addGestureRecognizer:pinchZoomRecognizer]; + [pinchZoomRecognizer release]; + */ /* Create a single tap recognizer to select the nearest object. @@ -196,12 +196,6 @@ static NSString *_MY_AD_WHIRL_APPLICATION_KEY_IPAD = @"2e70e3f3da40408588b9a3170 [self addGestureRecognizer: panGestureRecognizer]; [panGestureRecognizer release]; - /* - Use the pinch gesture recognizer to zoom in and out of a location on the screen. - */ - UIPinchGestureRecognizer *pinchGestureRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchDetected:)]; - [self addGestureRecognizer: pinchGestureRecognizer]; - [pinchGestureRecognizer release]; [menuKeyRecognizer release]; [selectKeyRecognizer release]; @@ -395,7 +389,16 @@ static NSString *_MY_AD_WHIRL_APPLICATION_KEY_IPAD = @"2e70e3f3da40408588b9a3170 #pragma mark - -#pragma mark Gesture Recognizer callbacks + +- (void)displayGameMenu +{ + g_engine->LeftClicked(-1, -1); // set the click pressed to offscreen + g_engine->HoldKey_NoRepeat( JGE_BTN_MENU); + [self performSelector:@selector(resetInput) withObject: nil afterDelay: 0.1]; +} + + + - (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { @@ -428,6 +431,7 @@ static NSString *_MY_AD_WHIRL_APPLICATION_KEY_IPAD = @"2e70e3f3da40408588b9a3170 return distance; } +#pragma mark Gesture Recognizer callbacks - (void)handlePanMotion: (UIPanGestureRecognizer *) panGesture { @@ -510,15 +514,13 @@ static NSString *_MY_AD_WHIRL_APPLICATION_KEY_IPAD = @"2e70e3f3da40408588b9a3170 } /* implement a zoom in /out function call */ -- (IBAction)pinchDetected:(UIGestureRecognizer *)sender { -/* - CGFloat scale = - [(UIPinchGestureRecognizer *)sender scale]; - CGFloat velocity = - [(UIPinchGestureRecognizer *)sender velocity]; +- (void) pinchDetected:(UIGestureRecognizer *)sender { + CGFloat scale = [(UIPinchGestureRecognizer *)sender scale]; + CGFloat velocity = [(UIPinchGestureRecognizer *)sender velocity]; - g_engine->Zoom( scale, velocity ); -*/ +// g_engine->Zoom( scale, velocity ); + if ( scale > 1.0 && ( ( velocity * velocity ) > 900)) + [self displayGameMenu]; } @@ -530,13 +532,6 @@ static NSString *_MY_AD_WHIRL_APPLICATION_KEY_IPAD = @"2e70e3f3da40408588b9a3170 [self performSelector:@selector(resetInput) withObject: nil afterDelay: 0.1]; } -- (void)displayGameMenu -{ - g_engine->LeftClicked(-1, -1); // set the click pressed to offscreen - g_engine->HoldKey_NoRepeat( JGE_BTN_MENU); - [self performSelector:@selector(resetInput) withObject: nil afterDelay: 0.1]; -} - - (void)handleMenuWithLongPress:(UILongPressGestureRecognizer *)recognizer { if (recognizer.state == UIGestureRecognizerStateEnded) { [self displayGameMenu]; @@ -564,6 +559,54 @@ static NSString *_MY_AD_WHIRL_APPLICATION_KEY_IPAD = @"2e70e3f3da40408588b9a3170 g_engine->HoldKey_NoRepeat(JGE_BTN_CANCEL); } +/* + Action Buttons are the PSP triangle, cross, square and circle buttons + */ +- (void)mapActionButtons: (UISwipeGestureRecognizer *) recognizer +{ + switch ([recognizer direction]) { + case UISwipeGestureRecognizerDirectionRight: + [self handleSecondary: recognizer]; + break; + + case UISwipeGestureRecognizerDirectionLeft: + [self handleInterrupt:recognizer]; + break; + + case UISwipeGestureRecognizerDirectionUp: + [self handleCancel:recognizer]; + break; + + case UISwipeGestureRecognizerDirectionDown: + [self handleOK: nil]; + break; + + default: + // ignore anything else + break; + } +} + +/* + map the d-Pad to swipe actions. + */ +- (void)mapDirectionalPad: (UISwipeGestureRecognizer *) recognizer +{ + switch ([recognizer direction]) { + case UISwipeGestureRecognizerDirectionRight: + [self handleHand: recognizer]; + break; + + case UISwipeGestureRecognizerDirectionLeft: + [self handleNextPhase:recognizer]; + break; + default: + // ignore anything else + break; + } +} + + #pragma mark - @@ -700,10 +743,10 @@ static NSString *_MY_AD_WHIRL_APPLICATION_KEY_IPAD = @"2e70e3f3da40408588b9a3170 //(in landscape mode): //Same explanation as the one in the method "adjustAdSize" for the Ad's width int screenWidth = [viewController.parentViewController.view bounds].size.width; - float yOffset = [viewController.parentViewController.view bounds].size.height - 50; + float yOffset = [viewController.parentViewController.view bounds].size.height - adSize.height; if ( isLandscape ) { - yOffset = screenWidth - 50; + yOffset = screenWidth - adSize.height; screenWidth = [viewController.parentViewController.view bounds].size.height; }