我有一个 GameScene
类和 Shapes
类。 Shapes
类由三种不同的形状组成。在我的 GameScene
类中,加载了不同的 Sprite ,当应用程序启动时,一个随机形状从 Shapes
类出现在屏幕上并与其中一个 Sprite 接触。我已经采用了几种不同的方法来进行接触检测,但我想我遗漏了一些东西。
这是 Shapes
类:
class Shapes: SKNode{
var cY = SKSpriteNode(imageNamed: "Shape1")
var sY = SKSpriteNode(imageNamed: "Shape2")
var pY = SKSpriteNode(imageNamed: "Shape3")
convenience init(pOffset: CGFloat) {
self.init()
positionOffset = pOffset
self.addChild(cY)
self.addChild(sY)
self.addChild(pY)
}
func updateDelta(delta: NSTimeInterval) {
.....
}
GameScene
类:
var can1 : Shapes!
let shapesCategory: UInt32 = 1 << 0
let seaCategory: UInt32 = 1 << 1
class GameScene: SKScene, SKPhysicsContactDelegate {
var sea = SKSpriteNode(imageNamed: "sea")
sea.position = pos1
physicsWorld.contactDelegate = self
sea.physicsBody = SKPhysicsBody(circleOfRadius: square.size.height / 2)
sea.physicsBody!.affectedByGravity = false
sea.physicsBody!.dynamic = false
sea.physicsBody!.categoryBitMask = seaCategory
sea.physicsBody!.collisionBitMask = shapesCategory
sea.physicsBody!.contactTestBitMask = shapesCategory
addChild(sea)
// for now I'm just dealing with if shape 1 was to spawn
can1 = Shapes(pOffset: size.width/4) // a shape spawns on this point
can1.cY.physicsBody = SKPhysicsBody(circleOfRadius: self.size.height / 28)
can1.cY.physicsBody!.dynamic = false
can1.cY.physicsBody?.categoryBitMask = shapesCategory
can1.cY.physicsBody?.collisionBitMask = seaCategory
can1.cY.physicsBody?.contactTestBitMask = seaCategory
addChild(can1)
}
func didBeginContact(contact: SKPhysicsContact) {
if (contact.bodyA.categoryBitMask) == seaCategory || (contact.bodyB.
categoryBitMask) == shapesCategory {
print("contact")
}
}
这也是处理它的正确方法吗?因为每次我引用 Shapes
类中的特定形状时,例如,说 can1.shape1
都会使每秒帧数急剧下降并使其变得滞后。
编辑:修复了代码行中的一些错误
最佳答案
这里的问题是您没有正确创建物理主体,在代码的原始版本中,您甚至没有将PhysicsBody分配给您需要的形状,而是将其分配给父级。在你的新版本中,你将它分配给形状,但 body 的值与 Sprite 不匹配,所以你的碰撞将关闭。
相反,像这样声明你的 body :
can1.cY.physicsBody = SKPhysicsBody(circleOfRadius: can1.cy.size.width / 2)
你的下一个问题是你关闭了动态,这实质上意味着物理不应该发生,让我们打开它。
can1.cY.physicsBody!.dynamic = false
最后,您的 didBeginContact
代码存在问题,没有保留谁点击谁的顺序,因此您需要确保正确检查字段。
你想要的是这样的:
func didBeginContact(contact: SKPhysicsContact) {
let bodyA = (contact.bodyA.categoryBitMask <= contact.bodyB.categoryBitMask) ? contact.bodyA : contact.bodyB
let bodyB = (contact.bodyA.categoryBitMask <= contact.bodyB.categoryBitMask) ? contact.bodyB : contact.bodyA
if ((bodyA.categoryBitMask == shapesCategory ) && (bodyB.categoryBitMask == seaCategory )){
print("contact")
}
}
关于ios - 如何检测在两个不同类中声明的 Sprite 之间的接触?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34582486/