Sprite Kit никогда не обнаруживает мое столкновение
Когда тело игрока встречает тело монстра, функция func didBeginContact(contact: SKPhysicsContact)
никогда не называется.
Мой класс реализовать SKPhysicsContactDelegate
class GameScene: SKScene, SKPhysicsContactDelegate
недвижимость collisionBitMask
я прокомментировал это, потому что я прочитал, что, если мы не поместим это, узел может столкнуться со всем узлом
Я добавляю свой плеер так:
bear.position = CGPoint(x:self.frame.width/20, y:self.frame.height/5)
bear.size = CGSize(width: self.frame.width/7, height: self.frame.height/5)
bear.physicsBody = SKPhysicsBody(rectangleOfSize: bear.frame.size)
bear.physicsBody?.dynamic = false;
bear.physicsBody?.categoryBitMask = PhysicsCategory.Player
bear.physicsBody?.contactTestBitMask = PhysicsCategory.Monster
//bear.physicsBody?.collisionBitMask = PhysicsCategory.Monster
Я добавляю монстра вот так:
let thePosition = CGPoint(x: positionX, y: (self.frame.height/7.4)*positionY)
let monster = SKSpriteNode(imageNamed: pattern as String)
monster.size = CGSize(width: self.frame.width/16, height: self.frame.height/11)
monster.name = name
monster.position = thePosition
monster.physicsBody = SKPhysicsBody(rectangleOfSize: monster.frame.size)
monster.physicsBody?.dynamic = false
monster.physicsBody?.categoryBitMask = PhysicsCategory.Monster // 3
monster.physicsBody?.affectedByGravity = false
monster.physicsBody?.contactTestBitMask = PhysicsCategory.Player // 4
//platformNode.physicsBody?.collisionBitMask = PhysicsCategory.Player // 5
addChild(monster)
моя физическая категория
struct PhysicsCategory {
static let None : UInt32 = 0
static let All : UInt32 = UInt32.max
static let Player: UInt32 = 0b1 // 1
static let Monster : UInt32 = 0b10 // 2
static let Projectile: UInt32 = 0b100 // 3
static let Plateforme: UInt32 = 0b1000 // 4
}
У меня есть несколько текстур, например, когда игрок идет, я называю это:
func walkingBear() {
bear.runAction( SKAction.repeatActionForever(SKAction.animateWithTextures(bearCoursFrames, timePerFrame: 0.1, resize: false, restore: true)), withKey:"cours")
}
Я инициализирую BearCoursFrames, как это
var walkFrames = [SKTexture]()
var numImages : Int = bearAnimatedAtlas.textureNames.count
for var i=1; i<=numImages/2; i++ {
let bearTextureName = "cours\(i)"
walkFrames.append(bearAnimatedAtlas.textureNamed(bearTextureName))
}
bearCoursFrames = walkFrames
Где моя ошибка, пожалуйста, я не могу найти решение в другом посте, любая помощь будет оценена
---------------------------------РЕДАКТИРОВАТЬ---------------- -------------- Решение: я просто добавляю self.physicsWorld.contactDelegate = self, и теперь оно работает.
2 ответа
Я просто добавляю
self.physicsWorld.contactDelegate = self
и это работает сейчас.
Ответ прост. Существует правило, согласно которому по крайней мере одно тело должно быть определено как динамическое, чтобы зарегистрировать контакт.
Измените или игрока или другое тело, чтобы быть динамичным, и контакт будет обнаружен.
Кроме того, если у вас уже нет, включите визуальное представление физики... Это может быть полезно, потому что иногда контакт не обнаруживается, потому что фактические тела не пересекаются друг с другом, например. когда точка привязки узла изменяется, таким образом, текстура и тело смещаются (это можно исправить, используя соответствующие инициализаторы класса SKPhysicsBody, но это очень распространенная ошибка).