有没有办法将声音效果应用于碰撞?
Is there a way to apply sound effects to collisions?
这是我与 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
}
}
}
}
}
}
这是我与 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
}
}
}
}
}
}