cocos2d-iOS - 手势识别器

9
有人成功地在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;
}

委托方法:

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

我的tap事件从未被调用过。
有人做过这个吗?手动实现滑动检测的手势识别有多难?
2个回答

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

这段代码用于场景控制器的超类中,所以选择器的目标被硬编码为“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;
    }

}

+1 给上面 cc 的答案,这是正确的方法。您可以使用所有的 UIGestureRecognizer 子类来检测平移、缩放和点击手势。您还可以使用 UILongPressGestureRecognizer,并使用状态 case UIGestureRecognizerStateChanged 来识别拖动手势。 - KomodoDave
6
漂亮、整洁、可爱。有两个小问题:1. locationInView返回UIKit坐标系中的坐标,使用前应将其转换为GL坐标,例如:p = [[CCDirector sharedDirector] convertToGL: [recognizer locationInView:[CCDirector sharedDirector].view]]; 2. openGLView已在Cocos2D 2.0中被弃用,已被[CCDirector sharedDirector].view取代。 - Eliot
非常感谢您发布这个 :) - Guru

6

这太棒了!只需确保使用ccTouches方法的节点在具有手势识别器的节点上方。 - TigerCoding
在Cocos2d 3.0中,没有可见的接口来使用[YourCCSprite addGestureRecognizer:YourGestureRecognizer]; 有什么解决方案吗? - Vishal Sharma
有关Cocos2d 3.0的gestureRecognizer类会有更新吗?这真的很重要,也是一个缺失的部分。 - lionserdar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接