【问题标题】:Swift Sprite Kit call Function againSwift Sprite Kit 再次调用 Function
【发布时间】:2015-03-31 12:57:27
【问题描述】:

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

为了让您了解我的游戏,有 2 个长目标,在屏幕底部彼此相邻生成,它们之间有一个间隙。 两个Objectives之间是contactNode,它决定了玩家是否穿过墙壁来得分。 目标无限生成。

游戏开始后,调用函数addObjectives。稍作延迟后,我想再次调用相同的函数,使用新节点,而旧生成的节点仍然存在并与新节点一起移动到顶部。

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

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

}

【问题讨论】:

    标签: ios loops swift sprite-kit


    【解决方案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)
    }
    

    【讨论】:

    • 非常感谢您的回答!但是我不想只添加一次contactNode,它应该总是与另外2个SpriteNodes. Also, how can I call the Function addObjectives`一起添加,而不停止已经添加的旧目标?我更新了我的帖子并添加了游戏创意以阐明项目。
    • 那么为什么不在你设置它的属性之前创建联系人节点呢?
    • 这不正是我做的吗?我创建 contactNode 的目标是让它们一起移动。 contactNode 是一个简单的 SKNode,只有一个物理体。如果我误解了你,请为我澄清!
    • 但您使用相同的实例。使用以下命令创建一个新节点:contactNode = SKNode()。我编辑了我的答案,让我知道现在是否更清楚
    • 我现在明白了。但是在“旧”contactNode 被移除之前,contactNode 将被调用(它将在屏幕顶部被移除,而它应该在 self.frame.size.height / 3 处再次生成)。错误代码不见了。我现在怎样才能得到想要的结果?我更新了我的帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多