1

基本上我有一个生成实体函数,理论上应该在屏幕上生成一个具有某些属性的随机气球。我设计了这样的方法:

-(void)spawnBalloon
{
    int a = arc4random_uniform(self.frame.size.width);
    int b = self.frame.size.height - 50;
    CGPoint loc = CGPointMake(a, b);
    [self spawnBalloonAtPoint:loc];
}

这种方法有效。当我在 init 函数中调用它时,它可以工作。当我在 touchesMoved() 函数中调用它时,它可以工作。但是,当我尝试在 init 方法中调用它时

[self runAction:[SKAction repeatActionForever:[SKAction performSelector:@selector(spawnBalloon) onTarget:self]]];

它失败。为什么是这样?我是否必须只使用“self”中的 performSelector 函数,然后使用 NSTimer 让它永远重复?

另外,我尝试将 NSLog 放入代码中,以查看它是否在重复操作中被执行,并且确实如此。唯一的问题是气球没有被添加到屏幕上。我的感觉是,当我通过repeatActionForever调用spawnBalloon函数时,self指的是不同的类?抱歉,如果这令人困惑,我对 Objective C 和 SpriteKit 还很陌生,我没有真正阅读大量内容,而是决定在需要时学习(但是我对 Java/C 有广泛的了解)

编辑:我发现如果我没有 repeatForever 操作,代码将执行并工作。但是,如果它在那里,它就不起作用。

4

2 回答 2

1

作为 DFrog 答案的补充,它将为您提供所需的结果,我认为您会发现在使用repeatActionForever:方法时理解为什么您的代码不起作用很有用。

repeatActionForever:方法需要非瞬时动作才能工作。这是来自文档:

要重复的动作必须具有非瞬时持续时间。

瞬间动作

瞬时动作在单个动画帧中开始和完成。例如,从其父节点移除节点的操作是瞬时操作,因为不能部分移除节点。相反,当操作执行时,节点会立即被删除。

非瞬时动作

非瞬时动作有一个持续时间,在该持续时间内它会激活其效果。执行时,动作在每一帧动画中进行处理,直到动作完成

正如您已经发现的那样performSelector:onTarget创建了一个调用某个对象上的方法的操作,但该操作立即运行。引用自文档:

...当动作执行时,目标对象的方法被调用。这个动作瞬间发生...

正如我上面提到的,repeatActionForever:方法需要一个非瞬时持续时间的动作,所以这就是为什么它不会像你期望的那样工作。

于 2015-06-09T13:08:32.977 回答
0

尝试这个:

[self runAction:[SKAction repeatActionForever:[SKAction sequence:@[
                                                                   [SKAction waitForDuration:0.1],
                                                                   [SKAction performSelector:@selector(spawnBalloon) onTarget:self]
                                                                   ]]]];
于 2015-06-09T04:33:09.943 回答