【发布时间】:2020-01-11 10:24:01
【问题描述】:
我正在开发一个涉及多个 Sprite 数组的游戏,我想检测它们之间的碰撞并根据哪些等指定函数。
假设我有一个由 16 个球 ballArray[I] 和 16 个块 blockaArray[I] 组成的数组,我可以使用索引号 I 轻松地遍历它们。
我给球一个物理类别 - 球,类似于块。然后我有 16 个 ID 物理类别,比如 ID1、ID2、ID3、ID4
所以我可以检测到碰撞,知道那是一个球撞到了一个方块,但我需要知道哪个球和哪个方块。
最好或最简单的方法是什么?我正在阅读有关 enumerateChildNodes(withName) 函数的信息,但没有使用它。或者我可以创建一个 PhysicsCategories 数组,我可以与 SpriteArray 一起迭代以进行比较和识别。
编辑:
感谢大家的帮助。我终于破解了它。令人惊讶的是,最终代码比我最初想象的要简单得多。仍然不完全了解这些位在我的类别中的位置,但可以正常工作。
我将尝试发布我的最终工作代码 - 您可能有改进建议。再次感谢并为我糟糕的 StackFlow 礼节道歉 - 我是新来的 :-)
所以我的物理类别被定义了。
struct PhysicsCategories {
static let BoxCategoryMask = UInt32(1<<7)
static let BallCategoryMask = UInt32(1<<8)
}
然后在我的函数中构建一个Sprites数组
boxBloqArray[i].physicsBody?.categoryBitMask = PhysicsCategories.BoxCategoryMask | UInt32(i)
boxBloqArray[i].physicsBody!.contactTestBitMask = PhysicsCategories.BallCategoryMask
球阵列也一样,只是 categoryBitMask
ballBloqArray[i].physicsBody?.categoryBitMask = PhysicsCategories.BallCategoryMask | UInt32(i)
我仍然不确定为什么一定要这样,但这是今晚的最后一个问题,我在最终工作检测代码中的 && 比较中将两个物体的方向弄错了:
var body1 = SKPhysicsBody()
var body2 = SKPhysicsBody()
if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
body1 = contact.bodyA
body2 = contact.bodyB
}
else {
body1 = contact.bodyB
body2 = contact.bodyA
}
// Check node collisions
for n in 0...15 {
for i in 0...15 {
if body2.categoryBitMask == PhysicsCategories.BallCategoryMask | UInt32(n) && body1.categoryBitMask == PhysicsCategories.BoxCategoryMask | UInt32(i) {
//if body1.node != nil {
print("Ball\(n) hit Box\(i)")
//}
}
}
}
现在正在打印正确的碰撞......可爱!......向前 下一步...再次感谢
【问题讨论】:
-
您不需要循环遍历
i和n,只需循环遍历let n = Int(body2.categoryBitMask & 0xf)和类似的i,但无论如何很高兴它正在工作。 -
好吧,这很聪明。所以 & 0xf 只是删除了类别的相关位并留下剩余的整数?惊人的。谢谢
标签: xcode sprite-kit