Обнаруживать, когда UIGestureRecognizer находится вверх, вниз, влево и вправо Cocos2d

У меня есть CCSprite, по которому я хочу перемещаться с помощью жестов. Проблема в том, что я новичок в Cocos2D. Я хочу, чтобы мой спрайт выполнял одно действие, когда жест вверх, другое действие, когда жест вниз, другое действие, когда жест правый, и то же самое для левого. Может ли кто-нибудь указать мне правильное направление?

Спасибо!


person Magnus    schedule 14.09.2011    source источник


Ответы (7)


Очевидно, каждый UISwipeGestureRecognizer может обнаруживать смахивание только в заданном направлении. Несмотря на то, что флаги направления могут быть объединены по ИЛИ, UISwipeGestureRecognizer игнорирует дополнительные флаги.

Решение состоит в том, чтобы добавить один UISwipeGestureRecognizer для каждого направления, в котором должен распознаваться жест смахивания, и установить направление каждого распознавателя соответственно вверх, вниз, влево и вправо. Если вы хотите протестировать смахивание в любом направлении, вам придется добавить четыре UISwipeGestureRecognizer.

Это немного странно, но у меня это сработало только так.

person LearnCocos2D    schedule 13.10.2011
comment
Это отлично работает, если вам нужны только смахивания. Если вам нужно одновременно распознавать смахивания и панорамирование, см. Мой ответ здесь: stackoverflow.com/questions/8181774/ - person Alex the Ukrainian; 23.12.2013

Используйте UIPanGestureRecogizer и определите направления, которые вам нужны. подробности см. в документации UIPanGestureRecognizer. -рр

// add pan recognizer to the view when initialized
UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panRecognized:)];
[panRecognizer setDelegate:self];
[self addGestureRecognizer:panRecognizer]; // add to the view you want to detect swipe on


-(void)panRecognized:(UIPanGestureRecognizer *)sender
{
    if (sender.state == UIGestureRecognizerStateBegan) {
        // you might want to do something at the start of the pan
    }

    CGPoint distance = [sender translationInView:self]; // get distance of pan/swipe in the view in which the gesture recognizer was added
    CGPoint velocity = [sender velocityInView:self]; // get velocity of pan/swipe in the view in which the gesture recognizer was added
    float usersSwipeSpeed = abs(velocity.x); // use this if you need to move an object at a speed that matches the users swipe speed
    NSLog(@"swipe speed:%f", usersSwipeSpeed);
    if (sender.state == UIGestureRecognizerStateEnded) {
        [sender cancelsTouchesInView]; // you may or may not need this - check documentation if unsure
        if (distance.x > 0) { // right
            NSLog(@"user swiped right");
        } else if (distance.x < 0) { //left
            NSLog(@"user swiped left");
        }
        if (distance.y > 0) { // down
            NSLog(@"user swiped down");
        } else if (distance.y < 0) { //up
            NSLog(@"user swiped up");
        }
        // Note: if you don't want both axis directions to be triggered (i.e. up and right) you can add a tolerence instead of checking the distance against 0 you could check for greater and less than 50 or 100, etc.
    }
}
person Richie Hyatt    schedule 28.01.2013
comment
Интересное решение, но стоит упомянуть, что большая часть точки UIGestureRecognizer и его подклассов заключается в стандартизации способа реализации жестов ... ваш код включает и предлагает использовать вашу собственную логику для различения движений в разных направлениях, скоростях и т. Д. . Это означает, что вы рискуете получить реализацию жеста, которая будет отличаться от той, к которой люди привыкли в iOS. Тем не менее, это может быть хорошим способом для некоторых случаев, например, когда вы хотите, чтобы перемещаемый / панорамированный объект перемещался во время считывания. - person S'pht'Kr; 26.08.2013

Направление по умолчанию - UISwipeGestureRecognizerDirectionRight. несколько направлений также можно указать следующим образом:

[swipeGesture setDirection: UISwipeGestureRecognizerDirectionRight|UISwipeGestureRecognizerDirectionLeft];

/// Но если вы хотите получить каждое направление, вот так:

 UISwipeGestureRecognizer *swipeGestureR = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeGestureRight:)];
[swipeGestureR setDirection: UISwipeGestureRecognizerDirectionRight ];
 [[[CCDirector sharedDirector] openGLView] addGestureRecognizer:swipeGestureR];

[swipeGestureR release];

UISwipeGestureRecognizer *swipeGestureL = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeGestureLeft:)];
[swipeGestureL setDirection: UISwipeGestureRecognizerDirectionLeft];
[[[CCDirector sharedDirector] openGLView] addGestureRecognizer:swipeGestureL];

[swipeGestureL release];

функция handleSwipeGestureLeft будет вызываться при смахивании влево, а handleSwipeGestureRight будет вызываться при смахивании вправо

person roundsun    schedule 22.03.2012

Добавьте по одному UISwipeGestureRecognizer для каждой оси (горизонтальной и вертикальной):

UISwipeGestureRecognizer *horizontalSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(action)];
[horizontalSwipe setDirection:(UISwipeGestureRecognizerDirectionRight |
                           UISwipeGestureRecognizerDirectionLeft )];

[self.view addGestureRecognizer:horizontalSwipe];

UISwipeGestureRecognizer *verticalSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(action)];
[verticalSwipe setDirection:(UISwipeGestureRecognizerDirectionUp |
                     UISwipeGestureRecognizerDirectionDown )];

[self.view addGestureRecognizer:verticalSwipe];
person Damien Romito    schedule 06.05.2015

-(void)addGesture {
UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeGesture:)];
    [self.view addGestureRecognizer:swipeGesture];
    [swipeGesture release];
}

-(void)handleSwipeGesture:(UISwipeGestureRecognizer *) sender {

if (sender.direction == UISwipeGestureRecognizerDirectionUp) {
  //do something
 }
else if (sender.direction == UISwipeGestureRecognizerDirectionDown) {
  //do something
 }
else if (sender.direction == UISwipeGestureRecognizerDirectionLeft) {
  //do something
 }
else if (sender.direction == UISwipeGestureRecognizerDirectionRight) {
  //do something
 }


}

Также можно использовать переключатель вместо всех операторов if

person Zigglzworth    schedule 14.09.2011
comment
Я добавил это, но он определяет только правильное направление. Я добавил такой жест: - (void) addGesture {UISwipeGestureRecognizer * swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget: self action: @selector (handleSwipeGesture :)]; [[[CCDirector sharedDirector] openGLView] addGestureRecognizer: swipeGesture]; [swipeGesture release]; } - person Magnus; 15.09.2011
comment
Ставим NSLog (направление жеста:% @, sender.direction); в начале метода - (void) handleSwipeGesture и посмотрите, что вы получите, проведя пальцем во всех направлениях ... странно, что он распознает только правильные. - person Zigglzworth; 15.09.2011
comment
Если я NSLog это, вывод: 1, что является значением для right. Есть ли другой способ распознавать жесты в cocos2d? - person Magnus; 15.09.2011
comment
По умолчанию для gesture.direction установлено ПРАВИЛЬНО, поэтому вы получаете только ПРАВИЛЬНО (1). - person Nishant; 06.04.2016

Несмотря на то, что здесь много полезной информации, я не смог найти быстрого ответа, в котором было бы все это.

Если вы хотите различать, является ли смахивание left или right, up или down, вам необходимо создать новый UISwipeGestureRecognizer для каждого направления.

Тем не мение! Это не так уж и плохо, потому что вы можете направить каждый из ваших распознавателей жестов к одному и тому же селектору, который затем может использовать оператор switch, как вы могли ожидать.

Сначала добавьте распознаватели жестов для каждого направления и направьте их в один и тот же селектор:

- (void)setupSwipeGestureRecognizers
{
    UISwipeGestureRecognizer *rightSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(userDidSwipeScreen:)];
    rightSwipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionRight;
    UISwipeGestureRecognizer *leftSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(userDidSwipeScreen:)];
    leftSwipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionLeft;
    [self.view addGestureRecognizer:rightSwipeGestureRecognizer];
    [self.view addGestureRecognizer:leftSwipeGestureRecognizer];
}

Во-вторых, различите направления с помощью оператора switch:

- (void)userDidSwipeScreen:(UISwipeGestureRecognizer *)swipeGestureRecognizer
{
    switch (swipeGestureRecognizer.direction) {
        case UISwipeGestureRecognizerDirectionLeft: {
            // Handle left
            break;
        }
        case UISwipeGestureRecognizerDirectionRight: {
            // Handle right
            break;
        }
        default: {
            break;
        }
    }
}
person kgaidis    schedule 11.03.2016

person    schedule
comment
Спасибо за ответ! Хотя фрагмент кода может ответить на этот вопрос, все же неплохо добавить дополнительную информацию, например, объяснить и т. Д. - person j0k; 24.09.2012