使用SKPhysicsBody和contactDelegate时,如何识别bodyA何时击中框架的特定边?

时间:2016-10-15 08:48:40

标签: sprite-kit contacts

我正在尝试制作 Pong 游戏。因此,我需要知道球何时击中框架的顶部和底部。所以我创建了一个边框与边框相同的边框,并创建了识别contact(didBegin)的函数。

Bundle

但框架的顶部和底部没有名字!那我怎么能这样做呢?

2 个答案:

答案 0 :(得分:1)

SKPhysicsContact包含名为contactPoint

的属性

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

func didBegin(_ contact: SKPhysicsContact) {
    point = contact.contactPoint
    ...
}

如果您的 TOP BOTTOM 是例如:

// 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)

您也可以使用此功能(旧CGRectContainsPoint()

if top.contains(point) {
   // the ball touch the top side
}

如果您不想计算顶部和底部,您也可以使用此功能:

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)))
}

你可以检查contactPoint和你身边的最短距离:

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 { ... }

在很少的条件下,你确切知道你的球在哪里。

我希望这可以帮到你。

答案 1 :(得分:0)

你需要给你的球和边缘一个物理类别并设置它的碰撞和接触面具。创建一个像这样的枚举

enum PhysicsCategory {
    static let worldBorder: UInt32 = 0x1 << 0
    static let ball: UInt32 = 0x1 << 1
}

感谢为您的节点提供这些类别,并设置接触和碰撞掩码。

 self.physicsBody?.categoryBitMask = PhysicsCategory.worldBorder
 self.physicsBody?.contactBitMask = PhysicsCategory.ball
 self.physicsBody?.collisionBitMask = PhysicsCategory.ball

 ball.physicsBody?.categoryBitMask = PhysicsCategory.ball
 // Set collision and contact if needed as well. Its usually fine to do it for 1 body only if they are the same.

你可以写这样的联系方式

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
    }
}

希望这有帮助