Swift - 未检测到随机碰撞
Swift - Random collisions are not detected
在我的游戏中,我使用 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 { [=12=] == 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 相互碰撞。
我刚刚修好了!原因是在函数 "touchesEnded" 中,我有一个递归函数正在删除 listContacts!
中的错误连接
在我的游戏中,我使用 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 { [=12=] == 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 相互碰撞。
我刚刚修好了!原因是在函数 "touchesEnded" 中,我有一个递归函数正在删除 listContacts!
中的错误连接