Sprite kit 当使用SKPhysicsBody和contactDelegate时,我如何识别bodyA何时击中框架的特定一侧?

Sprite kit 当使用SKPhysicsBody和contactDelegate时,我如何识别bodyA何时击中框架的特定一侧?,sprite-kit,contacts,Sprite Kit,Contacts,我想做个游戏。因此,我需要知道球何时击中框架的顶部和底部。因此,我制作了一个边界,其边缘与框架相同,并创建了识别接触的函数(didbegen) 但是框架的顶部和底部没有名称!那么我该怎么做呢?skphysiccontact包含一个名为 此属性以场景坐标显示两个物理实体之间的(CGPoint)接触点 func didBegin(_ contact: SKPhysicsContact) { point = contact.contactPoint ... } 例如,如果您的顶部和底

我想做个游戏。因此,我需要知道球何时击中框架的顶部和底部。因此,我制作了一个边界,其边缘与框架相同,并创建了识别接触的函数(didbegen)


但是框架的顶部和底部没有名称!那么我该怎么做呢?

skphysiccontact
包含一个名为

此属性以场景坐标显示两个物理实体之间的(
CGPoint
)接触点

func didBegin(_ contact: SKPhysicsContact) {
    point = contact.contactPoint
    ...
}
例如,如果您的顶部底部是:

// suppose myField is your playing field
let myFrame = myField.frame
// height should be the thickness of your side 
let top = CGRect(x:0, y:myFrame.size.height,width:myFrame.size.width,height:1) 
let bottom = CGRect(x:0, y:0,width:myFrame.size.width,height:1)
您也可以使用此功能(旧的)


如果不想计算顶面和底面,也可以使用此函数:

func getDistance(p1:CGPoint,p2:CGPoint)->CGFloat {
    let xDist = (p2.x - p1.x)
    let yDist = (p2.y - p1.y)
    return CGFloat(sqrt((xDist * xDist) + (yDist * yDist)))
}
您可以检查触点和您的侧面之间的最短距离,如下所示:

let myFrame = myField.frame
let dTop = getDistance(p1:contactPoint,p2:CGPoint(x:contactPoint.x,y:myFrame.maxY)
let dBottom = getDistance(p1:contactPoint,p2:CGPoint(x:contactPoint.x,y:myFrame.minY)

if dTop<dBottom {
    // ball is near top
} else { ... }
让myFrame=myField.frame
设dTop=getDistance(p1:contactPoint,p2:CGPoint(x:contactPoint.x,y:myFrame.maxY)
设dBottom=getDistance(p1:contactPoint,p2:CGPoint(x:contactPoint.x,y:myFrame.minY)

如果dTop您需要为球和边指定一个物理类别,并设置其碰撞和接触遮罩

enum PhysicsCategory {
    static let worldBorder: UInt32 = 0x1 << 0
    static let ball: UInt32 = 0x1 << 1
}
func didBegin(_ contact: SKPhysicsContact) {
    let firstBody: SKPhysicsBody
    let secondBody: SKPhysicsBody

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        firstBody = contact.bodyA
        secondBody = contact.bodyB
    } else {
        firstBody = contact.bodyB
        secondBody = contact.bodyA
    }

    // World border hit ball or ball hit worldBorder
    if (firstBody.categoryBitMask == PhysicsCategory.worldBorder) && (secondBody.categoryBitMask == PhysicsCategory.ball) {

        // Do something
    }
}
这样你就可以写联系方式了

enum PhysicsCategory {
    static let worldBorder: UInt32 = 0x1 << 0
    static let ball: UInt32 = 0x1 << 1
}
func didBegin(_ contact: SKPhysicsContact) {
    let firstBody: SKPhysicsBody
    let secondBody: SKPhysicsBody

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        firstBody = contact.bodyA
        secondBody = contact.bodyB
    } else {
        firstBody = contact.bodyB
        secondBody = contact.bodyA
    }

    // World border hit ball or ball hit worldBorder
    if (firstBody.categoryBitMask == PhysicsCategory.worldBorder) && (secondBody.categoryBitMask == PhysicsCategory.ball) {

        // Do something
    }
}
func didbeagin(uu联系人:skphysiccontact){
让第一个身体:SKPhysicsBody
让第二个主体:SKPhysicsBody
如果contact.bodyA.categoryBitMask

希望这有帮助

打印这些节点的名称有什么意义?不管怎样,如果没有名称,请给它一个:)另外,如果要检测帧的不同部分,请使用多个实体或边,并为它们指定不同的类别。查看inits SKPhysicsBody的其他功能
func didBegin(_ contact: SKPhysicsContact) {
    let firstBody: SKPhysicsBody
    let secondBody: SKPhysicsBody

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        firstBody = contact.bodyA
        secondBody = contact.bodyB
    } else {
        firstBody = contact.bodyB
        secondBody = contact.bodyA
    }

    // World border hit ball or ball hit worldBorder
    if (firstBody.categoryBitMask == PhysicsCategory.worldBorder) && (secondBody.categoryBitMask == PhysicsCategory.ball) {

        // Do something
    }
}