gpt4 book ai didi

Swift - 未检测到随机碰撞

转载 作者:行者123 更新时间:2023-11-30 13:19:56 25 4
gpt4 key购买 nike

在我的游戏中,我使用 SKSprite。未检测到某些碰撞。我尝试了 10 次,碰撞效果很好,但大约 25% 应该检测到的碰撞没有检测到。我不知道为什么,我尝试了很多东西。碰撞仅与同一类别的节点发生。

我不知道为什么当我可以明显看到它们时,为什么随机地没有发生一些碰撞,你有什么想法吗?感谢您的帮助。

这是 didBeginContact 的代码:

func didBeginContact(contact: SKPhysicsContact) {

var firstBody: SKPhysicsBody = contact.bodyA
var secondBody: SKPhysicsBody = contact.bodyB

if firstBody.categoryBitMask == secondBody.categoryBitMask {

listContacts.append([firstBody.node!,secondBody.node!])
}

}
}

这是 didEndContact 的代码:

func didEndContact(contact: SKPhysicsContact) {

var firstBody: SKPhysicsBody = contact.bodyA
var secondBody: SKPhysicsBody = contact.bodyB

if contact.bodyA.categoryBitMask == contact.bodyB.categoryBitMask {

for i in listContacts{

if (i.contains(firstBody.node!) && i.contains(secondBody.node!)){

let findIndex = listContacts.indexOf { $0 == i }
listContacts.removeFirst(findIndex!)
}
}

}

最后,当我声明一个新的 SKSpriteNode 时,我设置了这个:

rectangle.physicsBody = SKPhysicsBody(rectangleOfSize: rectangle.size)
rectangle.physicsBody?.dynamic = true
rectangle.physicsBody?.collisionBitMask = PhysicsCategory.None

usesPreciseCollisionDetection = true 不会改变任何内容,因此我不使用 usePrecisionCollisionDetection

每个SKSpriteNode 的categoryBitmask 和contactTestBitmask 都相等,因为只有相同的SKSpriteNode 才会发生碰撞。

另外:

physicsWorld.gravity = CGVectorMake(0, 0)
physicsWorld.contactDelegate = self

最后,如果您想轻松了解发生的情况,这里是我的游戏的简短视频(碰撞问题发生在矩形之间)https://www.youtube.com/watch?v=-pbmKwQiE9U

最佳答案

您似乎正在检查主体 A 的 categoryBitMask 是否等于主体 B。

if firstBody.categoryBitMask == secondBody.categoryBitMask {

listContacts.append([firstBody.node!,secondBody.node!])
}

}

只有当节点命中具有相同categoryBitMask的节点时,才会运行操作

您应该检查collisionBitMasks以查看是否发生碰撞,或者您可以检查名称。

对于使用categoryBitMask的示例,您可以执行以下操作:

func didBeginContact(contact: SKPhysicsContact) {

var sprite: SKSpriteNode!

if contact.bodyA.categoryBitMask == <your category bitmask> {
sprite = contact.bodyA.node! as! SKSpriteNode
}
else if contact.bodyB.categoryBitMask == <your category bitmask> {
sprite = contact.bodyB.node! as! SKSpriteNode
}

// Do something with sprite....
// You can also create another sprite, and assign it to the other body, and perform functions on it, or both A and B.
// It is good to have different functions you send can send the nodes to once you find out which ones they are.

}

您可以执行这些检查来查看哪些 Sprite 正在互相碰撞。

关于Swift - 未检测到随机碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37871550/

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