基本上我有一个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动作,代码将执行并工作。但是,如果它在那里,它不起作用。
答案 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]
]]]];