cocos2d-iOS - 手势识别器

Rob*_*ert 9 iphone cocos2d-iphone

有没有人设法让cocos-2d的手势识别工作?

我在这里读了一篇声称已经实现的帖子,在这里:http://www.cocos2d-iphone.org/forum/topic/8929

我在这里从git hub修补:https://github.com/xemus/cocos2d-GestureRecognizers/blob/master/README

我做了一个子类CCSprite(它的子类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;
}
Run Code Online (Sandbox Code Playgroud)

代表方法:

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

我的点击事件永远不会被调用.

有人有这个工作吗?手动进行手势识别以进行滑动检测有多难?

cc.*_*cc. 24

您需要将手势识别器附加到"上链"中.不要将它们连接到各个节点; 将它们附加到UIView(即[[CCDirector sharedDirector] openGLView]).

这是我做的:

- (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];
}
Run Code Online (Sandbox Code Playgroud)

此特定代码用于场景控制器的超类,因此选择器的目标被硬编码为"self",但您可以轻松地将其抽象为传入的对象.此外,您可以推断上述内容,轻松创建水龙头,捏合等手势识别器.

在控制器的子类中,我只是这样做:

- (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;
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 干净整洁,可爱.两个小问题:1.locationInView返回UIKit坐标系中的坐标,这些坐标应在使用前转换为GL坐标,例如:`[= [CCDirector sharedDirector] convertToGL:[识别器locationInView:[CCDirector sharedDirector] .view]] ;`2.从Cocos2D 2.0开始,不推荐使用openGLView,它已被`[CCDirector sharedDirector] .view`取代. (6认同)

Krz*_*cki 6

如果您不想手动处理所有内容,我创建了一个简单的类别,它将为任何cocos2d版本添加手势识别器,详情请阅读:

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

或者从github抓住它

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