2014-02-07 2 views
0

Я искал аналогичный вопрос и не нашел его, поэтому прошу прощения, если это уже было задано, но у меня возникают проблемы с ограничением количества касаний, которые SKScene позволит мне иметь. Я применил метод touchesBegan: withEvent: и настроил свои SKAction (-ы) для анимации, но то, что я хочу, пока анимируется узел спрайта, я не хочу, чтобы у него была возможность принять другое прикосновение ,Sprite Kit позволяет только одно касание

Я попытался подсчитать количество касаний, которые происходят, но это не сработало, поэтому я нахожусь в точке остановки.

Итак, мой основной вопрос: как мне создать «одно касание, а затем ждать окончания анимации, прежде чем может произойти другое прикосновение» в моей сцене?

Вот код:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
/* Called when a touch begins */ 

SKAction *jump = [SKAction moveToY:400 duration:.4]; 
SKAction *down = [SKAction moveToY:CGRectGetMidY(self.frame) duration:.4]; 
SKAction *action = [SKAction sequence:@[jump, down]]; 

for (UITouch *touch in touches) { 
    NSInteger touchesMax = 1; 
    NSInteger actualTouches = [touches count]; 
    NSLog(@"%ld", (long)actualTouches); 

    actualTouches++; 

    if (actualTouches > touchesMax) { 
     [farmer removeAllActions]; 
    } 
    else { 
     [farmer runAction:action]; 
    } 
} 
} 

любая помощь ценится

+0

Вы можете попробовать создать переменную "actualTouches" как глобальную для этого метода. Поскольку, возможно, из-за действительной переменной переменная инициализируется. –

ответ

4

Я считаю, что это сработает.В начале touchesBegan сделать

self.userInteractionEnabled = NO; 

Затем определить новый SKAction для того, чтобы взаимодействие с пользователем:

SKAction *enable = [SKAction runBlock:^{ self.userInteractionEnabled = YES; }]; 

Добавьте к вашей последовательности:

SKAction *action = [SKAction sequence:@[jump, down, enable]]; 
+0

Спасибо за подсказку, это было полезно для меня. Однако следует помнить, что запуск 'removeAllActions' предотвратит повторное подключение касания. – ErikHazzard

1

Самое простое решение для Вашего случая:

Как создать «в одно касание, а затем ждать анимации до конца, прежде чем может произойти другое прикосновение "в моей сцене?

Является ли отключить сенсорный при запуске анимации с использованием [self setUserInteractionEnabled:NO];

, и разблокирование его раз анимация делается.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    /* Called when a touch begins */ 

    SKAction *jump = [SKAction moveToY:400 duration:.4]; 
    SKAction *down = [SKAction moveToY:CGRectGetMidY(self.frame) duration:.4]; 
    SKAction *action = [SKAction sequence:@[jump, down]]; 

    [self setUserInteractionEnabled:NO]; 

    [farmer runAction:action completion^{ 
      [self setUserInteractionEnabled:YES]; 
    }]; 
} 

Теперь, если вы все еще хотите иметь сенсорную функциональность, просто не выполняйте действия, вы можете это сделать. Добавьте свойство к своей сцене, позвольте ему оживить его.

@property (nonatomic,assign)BOOL animating; 

Затем измените свой код, чтобы принять это значение во внимание:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    /* Called when a touch begins */ 

    SKAction *jump = [SKAction moveToY:400 duration:.4]; 
    SKAction *down = [SKAction moveToY:CGRectGetMidY(self.frame) duration:.4]; 
    SKAction *action = [SKAction sequence:@[jump, down]]; 

    self.animating = YES; 
    [farmer runAction:action completion^{ 
     self.animating = NO; 
    }]; 

} 

Таким образом, флаг анимации будет ДА ​​в то время как действие выполняется после завершения он будет установлен в NO, и новое действие может бежать.

1

Вам не обязательно проверять его таким образом. Вы можете использовать runAcrion: forKey на SKSpriteNode и после этого вы можете увидеть, если действие выполняется:

if (![farmer actionForKey:@"ActionKey"]) 
    [farmer runAction: runAction:action withKey:@"ActionKey"] 

Теперь вы просто запустить действие, если спрайт в не запустить его.

Смежные вопросы