2014-01-16 76 views
0

我有一個適用於Mac的SpriteKit遊戲我正在開發,我需要能夠檢查某些精靈節點何時低於某個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. y位置下方。當我在程序中使用這種方法,往往不承認低於80的球體,有時在從父體中移除之前多次記錄相同的orb。我有多個在屏幕上移動的球體,這就是爲什麼它沒有按照我預期的那樣運行的原因嗎?

謝謝,任何幫助,將不勝感激。

回答

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幀的速度運行,您可以遍歷所有的軌道並檢查它們是否在y軸上低於80。在行動或GCD中做這件事有點像把大象塞入槍中,用一個巨大的eledozer(大象推土機的俚語,而不是專利,令人驚訝的)塞滿他們的子彈。