В конце концов я понял, как решить эту проблему.
Сначала я добавил categoryBitMask
и collisionBitMask
для обоих объектов, космического корабля и астероидов.
ship.physicsBody?.categoryBitMask = 2
asteroid.physicsBody?.categoryBitMask = 4
ship.physicsBody?.collisionBitMask = 4
ball.physicsBody?.collisionBitMask = 2
Тогда я дал dynamicBody()
для них обоих.
ship.physicsBody = SCNPhysicsBody.dynamicBody()
asteroid.physicsBody = SCNPhysicsBody.dynamicBody()
Затем я добавил NSTimer
, чтобы помочь мне с обнаружением контактов, чтобы обновить каждые 0,1 секунды, чтобы увидеть, если есть контакт.
override func viewDidLoad()
{
NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: "checkContact", userInfo: nil, repeats: true)
}
func checkContact()
{
if (self.scene.physicsWorld.contactTestBetweenBody(ship.physicsBody, andBody: asteroid.physicsBody, options: nil) != nil)
{
println("CONTACT!")
}
}
Я не нужно, чтобы добавить SCNPhysicsContactDelegate
на мой взгляд, но лучше, чтобы добавить его, чтобы убедиться, нет никаких проблем синтаксиса или предупреждений.
И все!
ПРИМЕЧАНИЕ: Важно добавить dynamicBody()
или staticBody()
к нашим 3D-объектам, иначе он не будет иметь контакта. И важно добавить dynamicBody()
или staticBody()
к нашим 3D-объектам, прежде чем мы добавим их в качестве ребенка на нашу сцену.
Надеюсь, это поможет кому-то!
ли вы на самом деле с помощью SpriteKit (2D) или SceneKit (3D)? 'SCNPhysicsBody' не имеет' contactTestBitMask'. – rickster
Я использую SceneKit, мой плохой, я неправильно изменил 'categoryBitMask' для' contactTestBitMask', я изменю его прямо сейчас. –