iphone - sirve - cocos2d-iOS-Reconocedores de gestos
para que sirven los gestos en el iphone 6 (2)
Necesita conectar el reconocedor de gestos a algo "en la cadena". No los adjunte a los nodos individuales; adjúntelos a UIView (es decir, [[CCDirector sharedDirector] openGLView]).
Esto 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 en particular se usa en una superclase para controladores de escena, por lo que el objetivo para el selector está codificado en "sí mismo", pero podría abstraerlo fácilmente a un objeto pasado. Además, podría extrapolar lo anterior para crear fácilmente reconocedores de gestos para grifos, pellizcos, etc.
En la subclase para el controlador, entonces, solo hago 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;
}
}
¿Alguien ha logrado que el reconocimiento de gestos funcione en cocos-2d?
He leído una publicación aquí que afirma haberlo logrado, aquí: http://www.cocos2d-iphone.org/forum/topic/8929
He parcheado desde el centro 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 ha conseguido que esto funcione? ¿Qué tan difícil es realizar el reconocimiento de gestos manualmente para la detección de deslizamiento?
Si no quiere manejar todo manualmente, creé una categoría simple que agregará reconocedores de gestos a cualquier versión de Cocos2d, lea más en:
http://www.merowing.info/2012/03/using-gesturerecognizers-in-cocos2d/
o agarrarlo de github
https://github.com/krzysztofzablocki/CCNode-SFGestureRecognizers