Sprite kit SpriteKit中的多物理体

Sprite kit SpriteKit中的多物理体,sprite-kit,skphysicsbody,Sprite Kit,Skphysicsbody,我有一个40x40的矩形节点,我想检测底部何时接触平台 我试过这个 let feet = SKPhysicsBody(rectangleOfSize: CGSize(width: hero.frame.size.width, height: 1), center: CGPoint(x: 0, y: -(hero.frame.size.height/2 - 0.5))) 然后设置categoryBitMask,collisionBitMask,contactTestBitMask,并将其添加到h

我有一个40x40的矩形节点,我想检测底部何时接触平台

我试过这个

let feet = SKPhysicsBody(rectangleOfSize: CGSize(width: hero.frame.size.width, height: 1), center: CGPoint(x: 0, y: -(hero.frame.size.height/2 - 0.5)))
然后设置
categoryBitMask
collisionBitMask
contactTestBitMask
,并将其添加到hero

hero.physicsBody = SKPhysicsBody(bodies: [feet])
但是在
didBeginContact
中,
println()
不打印

我需要一个长方形的底部,一个长方形的顶部,因为如果英雄从下面撞到平台,碰撞会把他推倒

更新

下面是我如何设置位掩码的

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)
以及我如何检测它们是否接触

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
    }
}
func-didBeginContact(联系人:skphysiccontact){
不是英雄:SKPhysicsBody!;
if(contact.bodyA.categoryBitMask
冲突没有问题,但是当您使用
notTheHero.node
通过物理体打印节点名称时,您只能访问
SKNode
,而不能访问其名称的
NSString
属性。相反,尝试类似于
println(而不是thehero.node.name)的方法

向我们展示您用于为英雄设置位掩码的代码和为脚设置位掩码的平台,因为我只想知道英雄何时在平台上方。好的,然后是脚和平台位掩码的代码。打印节点时,里面是名称。为什么我需要println(而不是thehero.node.name)?您正在访问节点上的name属性,这就是为什么。这有助于解决冲突?
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
    }
}