Objective c SpriteKit:检查特定坐标的sprite是否按预期运行

Objective c SpriteKit:检查特定坐标的sprite是否按预期运行,objective-c,macos,coordinates,sprite-kit,Objective C,Macos,Coordinates,Sprite Kit,我正在为Mac开发一款SpriteKit游戏,我需要能够检查某些sprite节点何时低于某个Y轴。我目前正在使用此代码: -(void) hitOrMiss { double delayInSeconds = 0.1; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(popTime, di

我正在为Mac开发一款SpriteKit游戏,我需要能够检查某些sprite节点何时低于某个Y轴。我目前正在使用此代码:

-(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];
    });
}
-(无效)hitOrMiss{
双延迟频率=0.1;
dispatch_time_t popTime=dispatch_time(dispatch_time_NOW,(int64_t)(DelayUnseconds*NSEC_PER_SEC));
dispatch_after(popTime,dispatch_get_main_queue()^{
如果(球体位置y<80){
NSLog(@“小姐!”);
[orb从父对象移除];
}
[自虐];
});
}
它意味着每0.1秒运行一个连续循环,并检查y位置80以下的球体。当我在程序中使用此方法时,它通常不会确认低于80的orb,有时会在从父对象中删除同一orb之前多次记录该orb。我有多个球体在屏幕上移动,这就是为什么它不能像我预期的那样始终如一地工作的原因吗


谢谢,如果您有任何帮助,我们将不胜感激。

为什么不尝试使用
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]];
然而,操作可能相当繁重,因此,如果不需要0.1秒的延迟,那么最好将其放在更新方法中,正如这里的另一个提示所建议的那样。因此:

-(void)update:(CFTimeInterval)currentTime {
    [self enumerateChildNodesWithName:@"orb" usingBlock:^(SKNode *orb, BOOL *stop) {
        if (orb.position.y < 80) {
            NSLog(@"Miss!");
            [orb removeFromParent];
        }
    }];
}
-(void)更新:(CFTimeInterval)currentTime{
[使用block:^(SKNode*orb,BOOL*stop)的名称为@“orb”的自枚举子节点{
如果(球体位置y<80){
NSLog(@“小姐!”);
[orb从父对象移除];
}
}];
}

我会在场景的更新方法中这样做。SpriteKit游戏通常以每秒60帧的速度运行,您可以遍历所有球体,并检查它们在y轴上是否低于80帧。在行动或GCD中这样做有点像射杀大象,把大象塞进你的枪里,用一个巨大的电动推土机(俚语是大象推土机,没有专利,令人惊讶)

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