Swift Sprite Kit再次调用函数

时间:2015-03-31 12:57:27

标签: ios loops swift sprite-kit

我想使用SKSpriteNodes / SKNode进行无限循环,但循环无法正常工作。

为了给你一个关于我的游戏的想法,有2个长目标,在屏幕的底部彼此相邻产生,并且它们之间有间隙。 在两个目标之间是contactNode,它确定玩家是否通过墙壁来获得一个点。 目标产生无限。

游戏开始后,它会调用函数addObjectives。经过一小段时间后,我想再次使用新节点调用相同的函数,而旧的节点仍在那里,并使用新节点移动到顶部。

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

我不想在再次调用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()
    }

}

1 个答案:

答案 0 :(得分:1)

您收到错误,因为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)
}