我有一个GameScene
班级和Shapes
班级。 Shapes
类由三种不同的形状组成。在我的GameScene
类中,加载了不同的精灵,当应用程序启动时,随机形状从Shapes
类进入屏幕,并与其中一个精灵联系。我已经做了几种不同的方法来进行接触检测,但我想我错过了一些东西。
这是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
使得每秒的帧数大幅下降并使其变得滞后。
编辑:修复了代码行中的一些错误
答案 0 :(得分:1)
你的问题是你没有正确地创建物理主体,在原始版本的代码中,你甚至没有将PhysicsBody分配给你需要的形状,而是将它分配给父代。在新版本中,您将其指定给形状,但正文的值与精灵不匹配,因此您的碰撞将会关闭。
相反,声明你的身体是这样的:
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")
}
}