gpt4 book ai didi

ios - didBeginContact 被同一个 SKPhysicsBody 多次调用

转载 作者:搜寻专家 更新时间:2023-10-30 21:56:20 24 4
gpt4 key购买 nike

 func didBeginContact(contact: SKPhysicsContact) {
if ( contact.bodyA.categoryBitMask & BodyType.shield.rawValue ) == BodyType.shield.rawValue {
contact.bodyB.node?.removeFromParent()
counter++
println(counter)


} else if ( contact.bodyB.categoryBitMask & BodyType.shield.rawValue ) == BodyType.shield.rawValue {
contact.bodyA.node?.removeFromParent()
counter++
println(counter)
}
}

一个物理体来自纹理 shield.physicsBody = SKPhysicsBody(texture: shieldTexture, size: shieldTexture.size())

另一个来自圆 sand.physicsBody = SKPhysicsBody(circleOfRadius: sand.size.width/2)

当两个物体有时相互接触时 sand.physicsBody = SKPhysicsBody(circleOfRadius: sand.size.width/2)
被多次调用。我如何让它只为每个对象调用一次,即使我在它接触时立即将它从父对象中删除。

最佳答案

我已经弄清楚如何让 func didBeginContact(contact: SKPhysicsContact) 只被调用一次。这允许具有纹理 SKPhysicsBody(texture: size:) 的物理体计算一次碰撞,即使在现实中(由于纹理物理体的性质)此函数将被调用多次。

第一步:

为 SKSpriteNode 创建一个名称属性(我们将在此示例中使用球)并将其设置为一个唯一的名称。我们可以通过创建一个 int

var number = 0 

ball.name = "ball \(number)"

这允许在每次创建对象时使用唯一的名称。

第 2 步:

创建一个数组来保存这些,将球追加到数组中,增加数字

    var array: [String] = []
var number = 0

ball.name = "ball \(number)"
array.append(ball.name!)
number ++

第 3 步:现在在 func didBeginContact(contact: SKPhysicsContact) 中查找名称是否在数组中。如果它增加分数,删除节点,并从数组中删除名称。如果名称不在数组中,则不执行任何操作。

从数组中删除名称允许我们现在只计算一次函数调用。

func didBeginContact(contact: SKPhysicsContact) {
if ( contact.bodyA.categoryBitMask & BodyType.shield.rawValue ) == BodyType.shield.rawValue {
var name = contact.bodyB.node?.name!
let index = find(array, name!)

if contains(array, name!) {
score++
contact.bodyB.node?.removeFromParent()
array.removeAtIndex(index!)
}
}
}

关于ios - didBeginContact 被同一个 SKPhysicsBody 多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27956637/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com