/ / Wiele ciał fizyki w SpriteKit - sprite-kit, skphysicsbody

Wiele ciał fizyki w SpriteKit - sprite-kit, skphysicsbody

Mam węzeł prostokątny 40x40 i chcę wykryć, kiedy dno dotyka platformy.

Próbowałem tego

let feet = SKPhysicsBody(rectangleOfSize: CGSize(width: hero.frame.size.width, height: 1), center: CGPoint(x: 0, y: -(hero.frame.size.height/2 - 0.5)))

następnie ustaw categoryBitMask, collisionBitMask, contactTestBitMaski dodał go do bohatera

hero.physicsBody = SKPhysicsBody(bodies: [feet])

Ale w didBeginContact temu println() nie robi "t wydruku.

Potrzebuje ciało dla dolnej części prostokąta i jedna do góry, bo jeśli bohater uderza platformy od dołu kolizji należy wcisnąć go w dół.

Aktualizacja

Oto, jak ustawić maski bitowej

let heroFeetCategory: UInt32 = 1 << 0
let edgeCategory: UInt32 = 1 << 1
let groundCategory: UInt32 = 1 << 2

let feet = SKPhysicsBody(rectangleOfSize: CGSize(width: hero.frame.size.width, height: 10), center: CGPoint(x: 0, y: -(hero.frame.size.height/2 - 5)))
feet.collisionBitMask = edgeCategory | groundCategory
feet.contactTestBitMask = groundCategory

feet.categoryBitMask = heroFeetCategory


hero.physicsBody = SKPhysicsBody(bodies: [feet])
hero.physicsBody?.usesPreciseCollisionDetection = true
hero.physicsBody?.velocity = CGVectorMake(0, 0)

hero.physicsBody?.restitution = 0.0
hero.physicsBody?.friction = 0.0
hero.physicsBody?.angularDamping = 0.0
hero.physicsBody?.linearDamping = 1.0

hero.physicsBody?.allowsRotation = false
hero.physicsBody?.mass = 0.0641777738928795

world.addChild(hero)

i dla ziemi

let ground = SKSpriteNode(color: UIColor.whiteColor(), size: CGSizeMake(38, 38))
ground.name = "groundName"
ground.position = CGPoint(x: 0, y: -(self.frame.size.height/2 - ground.frame.size.height/2))

ground.physicsBody = SKPhysicsBody(rectangleOfSize: ground.size)
ground.physicsBody?.collisionBitMask = edgeCategory | heroFeetCategory
ground.physicsBody?.contactTestBitMask = heroFeetCategory
ground.physicsBody?.categoryBitMask = groundCategory
world.addChild(ground)

I jak mogę ustalić, czy one touch

func didBeginContact(contact: SKPhysicsContact) {

var notTheHero: SKPhysicsBody!;

if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) {
notTheHero = contact.bodyB;
} else {
notTheHero = contact.bodyA;
}

println(notTheHero.node) // print "heroName"
if (notTheHero.categoryBitMask == groundCategory) {
println("touch began?"); // is never called
}
}

Odpowiedzi:

-1 dla odpowiedzi nr 1

kolizji jest w porządku, ale podczas drukowania "s nazwa węzła przez ciało fizyki z notTheHero.node tylko dostęp SKNodei nie NSString Właściwość jego nazwy. Zamiast tego spróbuj coś w stylu println(notTheHero.node.name);