2011-02-13 10 views
9

nadie ha logrado obtener el reconocimiento de gestos que trabaja en cocos2d?cocos2d-IOS - Gesto reconocedores

He leído un post aquí que afirmó haber logrado, aquí: http://www.cocos2d-iphone.org/forum/topic/8929

remendé desde el cubo git aquí: https://github.com/xemus/cocos2d-GestureRecognizers/blob/master/README

hice una subclase de CCSprite (que es una subclase de CCNode):

-(id) initWithTexture:(CCTexture2D*)texture rect:(CGRect)rect { 
if((self=[super initWithTexture:texture rect:rect])) 
{ 
    CCGestureRecognizer* recognizer; 
    recognizer = [CCGestureRecognizer 
     CCRecognizerWithRecognizerTargetAction:[[[UITapGestureRecognizer alloc]init] autorelease] 
        target:self 
        action:@selector(tap:node:)]; 
    [self addGestureRecognizer:recognizer]; 
} 
return self; 
} 

método Delegado:

- (void) swipe:(UIGestureRecognizer*)recognizer node:(CCNode*)node 
{ 
NSLog(@" I never get called :("); 
} 

Mi evento tap nunca se llama.

Alguien tiene este trabajo? ¿Qué tan difícil es realizar el reconocimiento de gestos manualmente para la detección de deslizamiento?

Respuesta

24

Es necesario adjuntar el reconocedor gesto a algo "en la cadena". No los adjunte a los nodos individuales; adjúntelos a UIView (es decir, [[CCDirector sharedDirector] openGLView]).

Aquí es lo que hice:

- (UIPanGestureRecognizer *)watchForPan:(SEL)selector number:(int)tapsRequired { 
    UIPanGestureRecognizer *recognizer = [[[UIPanGestureRecognizer alloc] initWithTarget:self action:selector] autorelease]; 
    recognizer.minimumNumberOfTouches = tapsRequired; 
    [[[CCDirector sharedDirector] openGLView] addGestureRecognizer:recognizer]; 
    return recognizer; 
} 

- (void)unwatch:(UIGestureRecognizer *)gr { 
    [[[CCDirector sharedDirector] openGLView] removeGestureRecognizer:gr]; 
} 

Este código particular se utiliza en una superclase para los controladores de escena, por lo que el objetivo para el selector está codificada a la "libre", pero aquí se puede abstracto que a un objeto pasado. También, se puede extrapolar lo anterior para crear fácilmente reconocedores gesto para grifos, pellizcos, etc.

En la subclase para el controlador y, a continuación, acabo de hacer esto:

- (MyController *)init { 
    if ((self = [super init])) { 
     [self watchForPan:@selector(panning:) number:1]; 
    } 
    return self; 
} 

- (void)panning:(UIPanGestureRecognizer *)recognizer { 

    CGPoint p; 
    CGPoint v; 

    switch(recognizer.state) { 
     case UIGestureRecognizerStatePossible: 
     case UIGestureRecognizerStateBegan: 
      p = [recognizer locationInView:[CCDirector sharedDirector].openGLView]; 
      (do something when the pan begins) 
      break; 
     case UIGestureRecognizerStateChanged: 
      p = [recognizer locationInView:[CCDirector sharedDirector].openGLView]; 
      (do something while the pan is in progress) 
      break; 
     case UIGestureRecognizerStateFailed: 
      break; 
     case UIGestureRecognizerStateEnded: 
     case UIGestureRecognizerStateCancelled: 
      (do something when the pan ends) 
      (the below gets the velocity; good for letting player "fling" things) 
      v = [recognizer velocityInView:[CCDirector sharedDirector].openGLView]; 
      break; 
    } 

} 
+0

+1 para la respuesta de cc anterior, este es el método correcto. Puede usar todas las subclases UIGestureRecognizer de esta forma para detectar gestos de panoramización, pellizco y toque. También puede usar UILongPressGestureRecognizer con el estado de caso UIGestureRecognizerStateChanged identificado para detectar el arrastre. – KomodoDave

+6

Agradable y limpio, encantador. Dos pequeños problemas: 1. locationInView devuelve las coordenadas en el sistema de coordenadas UIKit, éstos deben ser convertidos a GL coordenadas antes de usar, por ejemplo: 'p = [[CCDirector sharedDirector] convertToGL: [reconocedor locationInView: [CCDirector sharedDirector] .Ver]] ; ' 2. openGLView está en desuso como de Cocos2D 2.0, se ha reemplazado por' [CCDirector sharedDirector] .view'. – Eliot

+0

¡Eso fue genial! Gracias ... –

6

Si no desea para manejar todo manualmente creé una categoría sencilla que agregará reconocedores gesto a cualquier versión cocos2d leer más en:

http://www.merowing.info/2012/03/using-gesturerecognizers-in-cocos2d/

o agarrarlo desde github

https://github.com/krzysztofzablocki/CCNode-SFGestureRecognizers

+0

¡Esto es asombroso! Solo asegúrate de hacer los nodos con los reconocedores de gestos encima de los nodos usando los métodos ccTouches. – TigerCoding

+0

en Cocos2d 3.0 no hay una interfaz visible para [YourCCSprite addGestureRecognizer: YourGestureRecognizer]; Entonces, ¿alguna solución para eso? –

+0

Sí, ¿habrá alguna actualización en la clase gestureRecognizer para Cocos2d 3.0 ??? Eso es realmente esencial y una parte faltante. – lionserdar

Cuestiones relacionadas