我试图用SpriteKit创建一个台球游戏,但是当涉及到它的物理部分时却遇到了问题。我试图设置它,所以当一个球击中另一个球时,被击中的球会反弹并最终减速并像台球一样停止。我正在使用.sks文件,所有三个球都使用了一个带有摩擦力的边界圆体类型。阻尼和角度。恢复设置为1.恢复原则设置为1.截至目前,当一个球被触摸时,它移动得非常慢,当两个球相互碰撞时,它们只是相互滑动。这就像没有速度一样。到目前为止,这是我的代码:
let blueBallName = "blueBall"
let orangeBallName = "orangeBall"
let pokeBallName = "pokeBall"
let blueBallCategory : UInt32 = 0x1 << 0
let orangeBallCategory : UInt32 = 0x1 << 1
let pokeBallCategory : UInt32 = 0x1 << 2
let borderCategory : UInt32 = 0x1 << 3
class PoolScene: SKScene, SKPhysicsContactDelegate {
var ballPoke : SKSpriteNode?
var ballBlue : SKSpriteNode?
var ballOrange : SKSpriteNode?
var isFingerOnBlueBall = false
override func didMove(to view: SKView) {
let borderBody = SKPhysicsBody(edgeLoopFrom: self.frame)
borderBody.friction = 0
self.physicsBody = borderBody
self.physicsWorld.gravity = CGVector(dx: 0, dy: 0)
physicsWorld.contactDelegate = self
ballBlue = childNode(withName: blueBallName) as? SKSpriteNode
ballOrange = childNode(withName: orangeBallName) as? SKSpriteNode
ballPoke = childNode(withName: pokeBallName) as? SKSpriteNode
ballBlue?.physicsBody?.categoryBitMask = blueBallCategory
ballOrange?.physicsBody?.categoryBitMask = orangeBallCategory
ballPoke?.physicsBody?.categoryBitMask = pokeBallCategory
borderBody.categoryBitMask = borderCategory
}
//Determines which ball user is touching
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch = touches.first
let touchLocation = touch!.location(in: self)
if let body = physicsWorld.body(at: touchLocation) {
if body.node!.name == blueBallName {
print("Blue ball touched")
isFingerOnBlueBall = true
let dragBallAction = SKAction.move(to: CGPoint(x: touchLocation.x, y: touchLocation.y), duration: 0.5)
ballBlue?.run(dragBallAction)
}
}
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
isFingerOnBlueBall = false
}
func didBegin(_ contact: SKPhysicsContact) {
// 1.
var firstBody: SKPhysicsBody
var secondBody: SKPhysicsBody
// 2.
if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
firstBody = contact.bodyA
secondBody = contact.bodyB
} else {
firstBody = contact.bodyB
secondBody = contact.bodyA
}
// 3.
if firstBody.categoryBitMask == blueBallCategory && secondBody.categoryBitMask == orangeBallCategory {
print("Hit Orange ball. First contact has been made.")
}
}
}
答案 0 :(得分:2)
您正在执行的操作只是MoveTo操作,因此您的精灵会尝试不断移动到那里。尝试使用SKAction施加力,这将向你想要移动到的方向向球施加力,但不会强行施力。它要去你场景中的特定位置,物理引擎应该照顾其余部分。除此之外,我没有看到你为任何球设置了碰撞位掩码,如果你想让它们相互碰撞,你应该设置例如blueBall.collisionBitMask = orangeBallCategory,反之亦然,尽管这对于简单的事情可能不是必需的像这样,它可能没有它。