【问题标题】:SpriteKit: Checking for a sprite of certain coordinates not functioning as expectedSpriteKit:检查某些坐标的精灵没有按预期运行
【发布时间】:2014-01-16 19:43:27
【问题描述】:

我正在开发一个适用于 Mac 的 SpriteKit 游戏,我需要能够检查某些精灵节点何时低于某个 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];
    });
}

它意味着每 0.1 秒运行一个连续循环,并检查 y 位置 80 以下的球体。当我在我的程序中使用这种方法时,它通常不承认低于 80 的球体,有时会记录相同的orb 多次,然后将其从父级中删除。我有多个球体在屏幕上移动,这就是为什么它没有像我预期的那样始终如一地运行的原因吗?

谢谢你,任何帮助将不胜感激。

【问题讨论】:

    标签: objective-c macos coordinates sprite-kit


    【解决方案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 属性设置为一个字符串(例如,@"orb"),然后在以下方法中使用该字符串:

    [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];
            }
        }];
    }
    

    【讨论】:

      【解决方案2】:

      我会在 SKScene 的更新方法中执行此操作。 SpriteKit 游戏通常以每秒 60 帧的速度运行,您可以遍历所有球体并检查它们在 y 轴上是否低于 80。在动作或 GCD 中这样做有点像用巨大的 elodozer(大象推土机的俚语,没有专利,令人惊讶)将大象塞进你的枪和子弹上来射击大象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-09
        • 1970-01-01
        • 1970-01-01
        • 2015-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-29
        相关资源
        最近更新 更多