我正在尝试制作 Pong 游戏。因此,我需要知道球何时击中框架的顶部和底部。所以我创建了一个边框与边框相同的边框,并创建了识别contact(didBegin)的函数。
Bundle
但框架的顶部和底部没有名字!那我怎么能这样做呢?
答案 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
}
}
希望这有帮助