2011-02-13 21 views
9

Cocos-2d'de jest tanımayı herkes çalıştırabilir mi?cocos2d-iOS - Hareket algılayıcıları

talep burada bir yazı okuma

burada, bunu elde ettik: http://www.cocos2d-iphone.org/forum/topic/8929

burada git göbeğinden yamalı: I CCNode bir alt sınıfıdır CCSprite bir alt sınıfı (yapılan

https://github.com/xemus/cocos2d-GestureRecognizers/blob/master/README):

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

temsilci yöntemi:

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

Dokunma olayım hiçbir zaman aranmaz.

Bu işe yarayan var mı? Kaydırma tespiti için manuel olarak jest tanımayı yapmak ne kadar zor?

cevap

24

Hareket algılayıcısını "zincirden yukarı" bir şey takmanız gerekir. Bunları bireysel düğümlere eklemeyin; onları UIView'ye (yani [[CCDirector sharedDirector] openGLView]) ekleyin. İşte

ne yaptım:

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

Bu özel kod sahne denetleyicileri için bir üst sınıfta kullanılan, bu yüzden seçici için hedef sabit kodlanmış "öz" için olduğunu, ancak bu size kolayca soyut olan bir geçiş nesnesi. Ayrıca, denetleyici için alt sınıfında vb kolayca musluklar, tutam için jest tanıyıcıları oluşturmak için

yukarıdaki tahmin olabilir, o zaman, ben sadece bunu:

- (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, cc'nin yukarıdaki yanıtı için bu doğru yöntemdir. Tüm UIGestureRecognizer alt sınıflarını bu şekilde tava, tutam, dokunma hareketlerini algılamak için kullanabilirsiniz. UILongPressGestureRecognizer'ı, sürüklemeyi algılamak için belirlenen durum bilgisi olan UIGestureRecognizerStateChanged ile de kullanabilirsiniz. – KomodoDave

+6

Güzel ve temiz, güzel. İki küçük sorun: 1. locationInView, UIKit koordinat sisteminde koordinatları döndürür, bunlar kullanmadan önce GL koordinatlarına dönüştürülmelidir, örn: p = [[CCDirector sharedDirector] convertToGL: [tanıyıcı konumuInView: [CCDirector sharedDirector] .view]] ; 2. openGLView, Cocos2D 2.0'dan itibaren kullanımdan kaldırıldı, [CCDirector sharedDirector] .view' ile değiştirildi. – Eliot

+0

Bu harika oldu! Teşekkürler ... –

6

sen istemiyorsan her şeyi işlemek için elle basit bir herhangi Cocos2d sürümü için jest tanıyıcıları katacak kategorisini okumak oluşturulan daha:

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

veya github

onu kapmak

+0

Bu harika! Sadece düğümleri ccTouches yöntemlerini kullanarak düğümlerin üstünde jest tanıyıcıları ile yaptığınızdan emin olun. Cocos2d 3.0'da – TigerCoding

+0

[YourCCSprite addGestureRecognizer: YourGestureRecognizer] için görünür bir arabirim yoktur; Yani bunun için herhangi bir çözüm? –

+0

Evet, Cocos2d 3.0 için gestureRecognizer sınıfında herhangi bir güncelleme olacak mı ??? Bu gerçekten gerekli ve eksik bir parça. – lionserdar