2014-01-16 4 views
0

У меня есть игра SpriteKit для Mac, которую я разрабатываю, и мне нужно иметь возможность проверить, когда определенные узлы спрайтов находятся ниже определенной оси Y. Я использую этот код в настоящее время:SpriteKit: проверка спрайта определенных координат не работает должным образом

-(void) hitOrMiss { 
    double delayInSeconds = 0.1; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
    dispatch_after(popTime, dispatch_get_main_queue(),^{ 
     if (orb.position.y < 80) { 
      NSLog(@"Miss!"); 
      [orb removeFromParent]; 
     } 
     [self hitOrMiss]; 
    }); 
} 

Он предназначен для работы непрерывного цикла каждые 0,1 секунды, и проверьте шарахи ниже ау позиции 80. Когда я использую этот метод в моей программе, часто не признает шары, которые ниже 80, и иногда логарифмирует один и тот же орб несколько раз, прежде чем удалять его из родителя. У меня есть несколько шаров, которые движутся по экрану, является ли это причиной того, что он не функционирует, как я ожидал от него последовательно?

Спасибо, любая помощь будет оценена.

ответ

1

Почему бы вам не попробовать использовать SKAction для достижения этой цели:

double delayInSeconds = 0.1; 
SKAction *yCheckAction = [SKAction sequence:@[[SKAction waitForDuration:delayInSeconds], [SKAction runBlock:^{ 
     if (orb.position.y < 80) { 
      NSLog(@"Miss!"); 
      [orb removeFromParent]; 
     } 
    }]]]; 
[self runAction:[SKAction repeatActionForever:yCheckAction]]; 

Если вам необходимо перечислить через каждый шар, вы можете установить orb.name свойство строки (скажем, @ «шар») , а затем использовать эту строку следующим способом:

[self enumerateChildNodesWithName:@"orb" usingBlock:^(SKNode *orb, BOOL *stop) { 
    // code to execute on every orb here 
}]; 

Тем не менее, действия могут быть весьма тяжелыми, так что если вы не должны иметь секундную задержку 0.1, это, вероятно, лучше всего поместить его в метод обновления, как предлагает другой совет. Итак:

-(void)update:(CFTimeInterval)currentTime { 
    [self enumerateChildNodesWithName:@"orb" usingBlock:^(SKNode *orb, BOOL *stop) { 
     if (orb.position.y < 80) { 
      NSLog(@"Miss!"); 
      [orb removeFromParent]; 
     } 
    }]; 
} 
0

Я бы сделал это в методе обновления SKScene. Обычно игры SpriteKit работают со скоростью 60 кадров в секунду, вы можете выполнять итерацию по всему шару и проверять, находятся ли они под 80 на оси y. Выполнение этого в действиях или GCD немного напоминает стрельбу слонов, набив их в ружье и над вашей пулей гигантским эльдозером (сленг для бульдозера-слона, не запатентованный, на удивление).

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