2013-09-26 16 views
11

Eksperymentowałem z UIGestureRecognizers i nowym SKScene/SKNode's w SpriteKit. Miałem jeden problem i zbliżyłem się do naprawy, ale jestem zdezorientowany z jednej strony. Zasadniczo mam aparat rozpoznawania gestów, który pozwala użytkownikowi przeciągnąć ikonkę na ekranie.UIPanGestureRecognizer w SKScene

Jedyny problem, jaki mam, polega na tym, że JEDEN dotknięcie faktycznie inicjuje gest panoramowania, a następnie tylko w drugim naciśnięciu działa poprawnie. Myślę, że to dlatego, że mój gest panoramy został zainicjowany w touchesBegan. Jednak nie wiem, gdzie go umieścić od czasu zainicjowania go w metodzie SKScene initWithSize, która uniemożliwiła rozpoznawanie gestów.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    if (!self.pan) { 

     self.pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(dragPlayer:)]; 
     self.pan.minimumNumberOfTouches = 1; 
     self.pan.delegate = self; 
     [self.view addGestureRecognizer:self.pan]; 
    } 
} 

-(void)dragPlayer: (UIPanGestureRecognizer *)gesture { 

     CGPoint trans = [gesture translationInView:self.view]; 

     SKAction *moveAction = [SKAction moveByX:trans.x y:-trans.y duration:0]; 
     [self.player runAction:move]; 

     [gesture setTranslation:CGPointMake(0, 0) inView:self.view]; 
    } 

Odpowiedz

11

To dlatego, że dodajesz gest w początkach dotyku, więc gest nie istnieje, dopóki ekran nie zostanie dotknięty co najmniej raz. Dodatkowo sprawdziłbym, czy faktycznie używasz initWithSize: jako swojego inicjatora, ponieważ nie powinieneś mieć żadnych problemów z dodaniem tam gestu.

Inną opcją jest przeniesienie kodu, aby dodać gest do -[SKScene didMovetoView:], który zostanie wywołany natychmiast po przedstawieniu sceny. Więcej informacji in the docs.

- (void)didMoveToView:(SKView *)view 
{ 
    [super didMoveToView:view]; 
    // add gesture here! 
} 
1

To jest mój pierwszy post! Mam nadzieję, że nie potknę się o własne palce ...

Cześć, więc wystąpił problem z działaniem aplikacji UISwipeGestureRecognizer. Inicjowałem go w mojej metodzie initWithSize, więc na podstawie tego wpisu przeniosłem go do mojej metody didMoveToView. Teraz działa (dziękuje 0x7fffffff). Wszystko, co zrobiłem, to wyciąć następujące dwie linie z jednej metody i wkleić je w drugiej.

_warpGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(warpToNextLevel:)]; 
[self.view addGestureRecognizer:_warpGesture]; 

W moim "dochodzenia" natknąłem userInteractionEnabled i próbował ustawić go na TAK w moim sposobie initWithSize ...

self.view.userInteractionEnabled = YES; 
NSLog(@"User interaction enabled %s", self.view.userInteractionEnabled ? "Yes" : "No"); 

Byłoby to log NO chociaż ja po prostu ustawić go TAK. Dalsze dochodzenie wykazało, że jeśli nie spróbuję ręcznie ustawić userInteractionEnabled, to NIE będzie podczas initWithSize (nie mogę tego zmienić, jeśli chcę) i automatycznie zostanie ustawione na YES, gdy jestem w didMoveToView.

Wszystko to wydaje mi się trafne, ale chciałabym, aby ktoś z tych, którzy znają ten język, wyjaśnił, co tu się dzieje. Dzięki!

Powiązane problemy