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