Ios Swift精灵套件再次调用功能

Ios Swift精灵套件再次调用功能,ios,loops,swift,sprite-kit,Ios,Loops,Swift,Sprite Kit,我想用我的SKSpriteNodes/SKNode做一个无限循环,但是循环不能正常工作 为了让你了解我的游戏,有两个长长的目标,在屏幕底部彼此相邻,中间有一个间隙。 在两个目标之间是contactNode,它确定玩家是否通过墙来得分。 目标无限地产生 游戏开始后,它调用函数addObjectives。在一个小的延迟之后,我想再次调用相同的函数,使用新节点,而旧的派生节点仍然存在,并使用新节点移动到顶部 但在我的代码中,节点到达更新:中给出的点后,它们停止,场景再次调用函数,新节点移动到该点并再次

我想用我的
SKSpriteNodes
/
SKNode
做一个无限循环,但是循环不能正常工作

为了让你了解我的游戏,有两个长长的目标,在屏幕底部彼此相邻,中间有一个间隙。 在两个目标之间是contactNode,它确定玩家是否通过墙来得分。 目标无限地产生

游戏开始后,它调用函数
addObjectives
。在一个小的延迟之后,我想再次调用相同的函数,使用新节点,而旧的派生节点仍然存在,并使用新节点移动到顶部

但在我的代码中,节点到达更新:中给出的点后,它们停止,场景再次调用函数,新节点移动到该点并再次停止。无限循环

我不想在再次调用
addObjectives
后停止节点,它们应该从屏幕底部生成并移动到顶部,然后被删除,而底部总是会出现新的目标

我该怎么做

...
var contactNode = SKNode()
...

func addObjectives(){

    O1 = SKSpriteNode(imageNamed: "Objective.png")
    O1.size = CGSize(width: self.frame.size.width / 1.3, height: self.frame.size.height / 17)
    O1.position = positions[randomPosition()]
    O1.zPosition = 3

    ...

    self.addChild(O1)

    O2 = SKSpriteNode(imageNamed: "Objective.png")
    O2.size = CGSize(width: self.frame.size.width / 1.3, height: self.frame.size.height / 17)
    O2.position = CGPoint(x: O1.position.x + CGFloat(Gap), y: O1.position.y)
    O2.zPosition = 3

    ...

    self.addChild(O2)

    contactNode.physicsBody = SKPhysicsBody(rectangleOfSize:CGSize(width: CGFloat(Gap) / 2, height: O1.size.height))
    contactNode.position = CGPoint(x: O1.position.x + (CGFloat(Gap) / 2), y: O1.position.y - 20)
    contactNode.physicsBody?.dynamic = false
    contactNode.physicsBody?.categoryBitMask = ScoreCategory
    contactNode.physicsBody?.contactTestBitMask = PlayerCategory
    contactNode.physicsBody?.collisionBitMask = 0

    self.addChild(contactNode)
}

//Called in the Update Method

func ScrollingMauer(){

    O1.position = CGPointMake(O1.position.x, O1.position.y + Speed)
    O2.position = CGPointMake(O2.position.x, O2.position.y + Speed)
    contactNode.position = CGPointMake(contactNode.position.x, contactNode.position.y + Speed)

    if(O1.position.y > self.frame.size.height + O1.size.height)
    {
        O1.removeFromParent()
    }

    if(O2.position.y > self.frame.size.height + O2.size.height)
    {
        O2.removeFromParent()
    }

    if(contactNode.position.y > self.frame.size.height + Mauer2.size.height)
    {
        contactNode.removeFromParent()
    }

    // Here the Function is called again, but the previous spawned
    Objectives stop and the new Objectives come from the bottom to the top.

    if(O1.position.y > self.frame.size.height / 3)
    {
        self.addObjectives()
    }

}

由于
contactNode
已添加到场景中,因此会出现错误,因此再次添加它将产生此错误,因为
contactNode
已具有父节点

您可以使用布尔标志指示是否已添加节点,并仅添加一次:

    contactNode.physicsBody = SKPhysicsBody(rectangleOfSize:CGSize(width: CGFloat(Gap) / 2, height: O1.size.height))
    contactNode.position = CGPoint(x: O1.position.x + (CGFloat(Gap) / 2), y: O1.position.y - 20)
    contactNode.physicsBody?.dynamic = false
    contactNode.physicsBody?.categoryBitMask = ScoreCategory
    contactNode.physicsBody?.contactTestBitMask = PlayerCategory
    contactNode.physicsBody?.collisionBitMask = 0

    if !self.contactNodeAdded {
        self.addChild(contactNode)
        self.contactNodeAdded = true
    }
在您的
ScrollingMauer
方法中:

if(contactNode.position.y > self.frame.size.height + Mauer2.size.height)
    {
        contactNode.removeFromParent()
        self.contactNodeAdded = false
    }
(也可以按名称搜索节点,但效率较低,尤其是在每次帧更新时调用时)

编辑: 如果要为每个联系人节点创建一个新实例,请创建一个:

contactNode = SKNode()
// set physics body etc..
contactNodesArray.append(contactNode)
要跟踪这些实例(以便以后删除),请将它们存储在阵列中,并像在“删除联系人”节点逻辑中那样检查阵列的每个实例:

let nodesToRemoveArray: Array<Int> = Array();
for (index, node) in enumerate(contactNodesArray) {
    if(node.position.y > self.frame.size.height + Mauer2.size.height)
    {
        node.removeFromParent()
        nodesToRemoveArray.append(index);
    }
}

for indexToRemove in nodesToRemoveArray {
    contactNodesArray.removeATIndex(indexToRemove)
}
让nodesToRemoveArray:Array=Array();
用于枚举(ContactNodeArray)中的(索引、节点){
if(node.position.y>self.frame.size.height+Mauer2.size.height)
{
node.removeFromParent()节点
nodesToRemoveArray.append(索引);
}
}
用于索引在节点删除阵列中移动{
ContactNodeArray.removeATIndex(indexToRemove)
}

非常感谢您的回答!但我不想只添加一次contactNode,它应该始终与其他两个SpriteNode一起添加。另外,如何在不停止已添加的旧目标的情况下再次调用函数addObjectives`?我更新了我的帖子,并添加了游戏理念来澄清这个项目。那么为什么不在设置联系人节点的属性之前创建它呢?这不正是我做的吗?我创建contactNode,目标是将它们移动到一起。contactNode是一个简单的SKNode,只有一个physicsBody。如果我误解了你,请为我澄清!但是您使用相同的实例。使用:contactNode=SKNode()创建新节点。我编辑了我的答案,让我知道现在是否更清楚我现在明白了。但即使在删除“旧”contactNode之前,contactNode也会被调用(它将在屏幕顶部被删除,而它应该在self.frame.size.height/3下再次生成)。错误代码消失了。我现在怎样才能得到想要的结果?我更新了我的帖子。