2015-04-21 5 views
0

В настоящее время я работаю над каким-то топ-гонщиком, если хотите. Идея состоит в том, чтобы иметь две кнопки, каждая для поворота автомобиля влево или вправо. Все это работает, но работает только одним прикосновением. Я хотел бы, чтобы игрок повернул машину, просто нажав кнопку. У меня теперь естьSpritekit вращает узел при касании

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

    for (UITouch *touch in touches) { 
     touched = YES; 
     CGPoint location = [touch locationInNode:self]; 
     SKNode *node = [self nodeAtPoint:location]; 

     if ([node.name isEqualToString:@"buttonLeft"]) { 
      while (touched == YES) { 
       playerRotate = player.zRotation; 
       playerRotate += playerAngle; 
      } 
     } 
    } 
} 

-(void)update:(CFTimeInterval)currentTime { 
    /* Called before each frame is rendered */ 
    player.zRotation = playerRotate; 
    float dx = playerSpeed * cos(player.zRotation); 
    float dy = playerSpeed * sin(player.zRotation); 
    player.physicsBody.velocity = CGVectorMake(dx, dy); 
} 

Скорость автомобиля игроков обновляется в функции обновления. И в прикосновениях Затронутое касание установлено на НЕТ. Проблема в том, что этот цикл while застревает (и мой телефон больше не обрабатывает никаких касаний), но я не знаю другого способа продолжать вращать автомобиль, пока нажата кнопка. Код работает, если я удаляю цикл while. Любая помощь приветствуется!

ответ

0

У вас уже есть правильная идея. Вместо того, чтобы установить BOOL, затронутый общим YES для всех нажатий. Создайте touchLeft и touchRight BOOL.

После того, как ваш if([node.name isEqualToString:@"buttonLeft"]) установил touchLeft BOOL в положение YES. Создайте if([node.name isEqualToString:@"buttonRight"]) и установите touchRight BOOL.

В вашем методе обновления вы можете проверить значение BOOL YES и применить соответствующий код.

Помните, что вам также необходимо создать такую ​​же логику кода для touchesEnded, чтобы установить BOOL обратно в NO, если сенсор больше не присутствует.

+0

Спасибо, что работает действительно приятно! Для других людей, имеющих ту же проблему, я наткнулся на другой способ непрерывного вращения узла. Я создал «SKAction * rotation = [SKAction rotateByAngle: playerAngle duration: 0.2];', который вращает узел, и повторил это действие навсегда в касаниях, а затем удалил ActionForKey в touchesEnded. Это также дает возможность сделать его более гладким с продолжительностью. Я не знаю, будет ли это позже создавать ошибки, но на данный момент его работы! – Jeroen