SKAction repeatActionForever不会产生实体

时间:2015-06-09 03:41:28

标签: objective-c sprite-kit performselector spawning

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

-(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动作,代码将执行并工作。但是,如果它在那里,它不起作用。

2 个答案:

答案 0 :(得分:1)

作为对DFrog的回答的补充,这将为您提供所需的结果,我认为您会发现在使用repeatActionForever:方法时您的代码无效的原因很有用。

repeatActionForever:方法需要非即时操作才能工作。这是来自docs:

  

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

即时行动

  

瞬时动作在单帧中开始并完成   动画。例如,从其父节点中删除节点的操作是   瞬时动作,因为无法部分删除节点。   相反,当操作执行时,会立即删除该节点。

非即时行动

  

非瞬时动作的持续时间超过动作的持续时间   效果。执行时,动作将在每一帧中处理   动画直到动作完成

正如您所知,performSelector:onTarget已经创建了一个在某个对象上调用方法的操作,但该操作会立即 。从文档引用:

  

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

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

答案 1 :(得分:0)

试试这个:

[self runAction:[SKAction repeatActionForever:[SKAction sequence:@[
                                                                   [SKAction waitForDuration:0.1],
                                                                   [SKAction performSelector:@selector(spawnBalloon) onTarget:self]
                                                                   ]]]];