这是我与Swift合作的第一个项目,我正在尝试学习,但是我遇到了麻烦,无法在线找到解决方案。基本上,这是一个pong的克隆,到目前为止一切都很好。我的问题是,一旦我的球击中了桨,我将无法理解如何播放声音效果。发生碰撞的其他一切都还可以,其他声音,如进球,都很好。只是无法弄清楚两个精灵碰撞时如何播放声音。这是我写的:
func didBegin(_ contact: SKPhysicsContact) {
if contact.bodyA.node?.name == "main" && contact.bodyB.node?.name == "ball" || contact.bodyB.node?.name == "main" && contact.bodyA.node?.name == "ball" || contact.bodyA.node?.name == "enemy" && contact.bodyB.node?.name == "ball" || contact.bodyB.node?.name == "enemy" && contact.bodyA.node?.name == "ball" {
ball.run(blipPaddleSound)
}
}
都错吗?
我已经尝试破坏if语句,并且已经尝试使我的节点之一运行声音效果(ball.run('nameofthesound')。我想这可能是文件问题,但是其他效果在代码的那部分中也没有发挥出来。我认为碰撞没有问题,因为球在桨和墙壁上弹跳没有问题
这是我放置所有碰撞和接触面罩的代码的一部分:
ball.physicsBody?.contactTestBitMask = 1
ball.physicsBody?.collisionBitMask = 3
ball.physicsBody?.categoryBitMask = 1
main.physicsBody?.contactTestBitMask = 3
main.physicsBody?.collisionBitMask = 1
main.physicsBody?.categoryBitMask = 2
enemy.physicsBody?.contactTestBitMask = 3
enemy.physicsBody?.collisionBitMask = 1
enemy.physicsBody?.categoryBitMask = 2
很可能您没有将SKPhysicsContactDelegate
设置为场景
您还会发现,一次碰撞可以在游戏周期内触发多个触发器,因此您可能需要放置一个变量来控制声音的播放,以使每次碰撞不会多次播放
class GameScene: SKScene, SKPhysicsContactDelegate {
private var didCollide = false
func didBegin(_ contact: SKPhysicsContact) {
let object1 = contact.bodyA.node?.name
let object2 = contact.bodyB.node?.name
if object1 == "ball" || object2 == "ball" {
if object1 == "main" || object2 == "main" || object1 == "enemy"|| object2 == "enemy" {
//check if we have just collided within the last 0.3 seconds
if !didCollide {
//set the marker to true so that the sound doesn't repeatedly fire
didCollide = true
//play the sound
ball.run(blipPaddleSound)
//wait 0.3 seconds (give the ball a chance to move away from the object)
self.run(.wait(forDuration: 0.3) {
self.didCollide = false
}
}
}
}
}
}