Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我们如何在检测下一个动作之前等待一段时间?_Ios_Objective C_Sprite Kit - Fatal编程技术网

Ios 我们如何在检测下一个动作之前等待一段时间?

Ios 我们如何在检测下一个动作之前等待一段时间?,ios,objective-c,sprite-kit,Ios,Objective C,Sprite Kit,基本上这就是我喜欢做的: -(void)didBeginContact:(SKPhysicsContact *)contact { uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask); if (collision == (CNPhysicsCategoryCat|CNPhysicsCategoryBed)) { _catNode.userDa

基本上这就是我喜欢做的:

-(void)didBeginContact:(SKPhysicsContact *)contact
{
     uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);
     if (collision == (CNPhysicsCategoryCat|CNPhysicsCategoryBed)) {
         _catNode.userData = [@{@"catOnBed":@(YES)} mutableCopy];
         //Code here can let me wait for 3 seconds or something.
         (_catNode.userData[@"catOnBed"])?[self win]:[self lose];
     }
     if (collision == (CNPhysicsCategoryCat|CNPhysicsCategoryEdge)) {
         [self lose];
     }
}
所以我想在接触发生3秒后进行检测

我尝试了dispatch_time方法,它向我返回“断点2.1”。截图如下:

然后我还尝试了PerformSelect方法,它告诉我未声明的“detectContact…”

我也创造了这个方法,这是证据

然后我尝试了SKAction sequence方法(我认为这个方法是封闭的)。它也失败了:

这是堆栈跟踪:


您可以使用延迟任务

int64_t delay = 3;
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, delay * NSEC_PER_SEC);
dispatch_after(time, dispatch_get_main_queue(), ^(void){
    // do whatever you want to do after 3 seconds.
});

使用调度时间\u不喜欢这样

double delaySeconds = 2.0;
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delaySeconds * NSEC_PER_SEC));
dispatch_after(time, dispatch_get_main_queue(), ^(void){
    (_catNode.userData[@"catOnBed"])?[self win]:[self lose];
});

您可以使用
-[NSObject performSelector:withObject:afterDelay]
。有关更多信息,请参阅。基本上,您的代码如下所示:

-(void)didBeginContact:(SKPhysicsContact *)contact {
    // Other code
    [self performSelector:@selector(detectContact) withObject:nil afterDelay:3];
}

- (void)detectContact {
    // Code to be execute after 3 second delay
}

detectContact方法将在3秒后调用。

引入一个新的带延迟的
SKAction

SKAction *delayedBlock = [SKAction sequence:@[[SKAction waitForDuration:2.0], 
                                              [SKAction runBlock:
^{
    // Perform action here.
}]]];
然后在相关节点上运行它,可能是
SKScene

// Assuming that self is the SKScene
[self runAction:delayedBlock];

我建议使用
SKAction
s而不是其他建议的替代方案,被限制在
SpriteKit

的运行循环中,阅读后可能会重复,我认为这不是同一个问题,因为我在这里调用一个方法,这个问题是关于通过原始方法创建延迟。我感觉你甚至不确定你在问什么。此外,如果没有返回正确的错误和堆栈跟踪,您发布的断点图像基本上是无用的。左边的是堆栈跟踪,右边的是普通组装,除非你是个魔术师,否则它是无用的。转到底部的控制台,粘贴控制台输出,具体错误应该在那里。当我使用这个方法时,它给了我断点2.1:(截图)所以你设置了断点,删除它。左边的蓝色标签。你说“左边的蓝色标签”是什么意思?读一下断点,当我使用这个方法时,它给了我断点2.1:(屏幕截图)它说的是未声明的标识符。屏幕截图:您必须定义“detectContact”方法。这只是一个示例方法名。该方法将保存延迟后要执行的任何代码。在调用上面显示的原始方法时,我在哪里定义该方法以及如何定义它?您可以像其他方法一样声明和实现它。我在回答中加了一个例子。谢谢你。它仍然显示了相同的信息:我认为这是一个解决方案(或者至少非常封闭)。我仍然遇到断点1.1 tho:,@AeroWindwalker。由于某种原因,如果使用此方法,它似乎会运行所需的操作两次,而不是仅运行一次。可能是因为碰撞发生多次?确保你只发射一次。这很奇怪,因为其他方法不会导致这种现象。