Sprite kit 雪碧套装,罐装';我找不到错误

Sprite kit 雪碧套装,罐装';我找不到错误,sprite-kit,swift3,Sprite Kit,Swift3,请帮我找出一个错误 我需要每个垫板播放阵列中自己的声音,但只有垫板13、14、15可以。同时,我在每个焊盘上贴上一个带有节点名称的标签,这说明节点有一个名称,所以看起来问题不在名称上,我无法理解它是什么。 如果你对改进这段代码还有什么要说的,请随意说,我是新手,很乐意听你这么说 我做错了什么 谢谢 PS:我想说的是,我在雪碧装备上这么做只是为了挑战 import SpriteKit import GameplayKit import AVFoundation class GameScene:

请帮我找出一个错误

我需要每个垫板播放阵列中自己的声音,但只有垫板13、14、15可以。同时,我在每个焊盘上贴上一个带有节点名称的标签,这说明节点有一个名称,所以看起来问题不在名称上,我无法理解它是什么。 如果你对改进这段代码还有什么要说的,请随意说,我是新手,很乐意听你这么说

我做错了什么

谢谢

PS:我想说的是,我在雪碧装备上这么做只是为了挑战

import SpriteKit
import GameplayKit
import AVFoundation

class GameScene: SKScene {

var i = 1
let sounds  = ["Kick", "Clap","Hat","OpHat","Snare","Cow","Crash","Snap","Chant","Tom","11","12","13","14","15"]

override func didMove(to view: SKView) {

    do {

        for sound in sounds {

            let player = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: Bundle.main.path(forResource: sound, ofType: "wav")!) as URL)
            player.prepareToPlay()

        }


    } catch {

    }

    var frameHightMulti = CGFloat(0)

    self.physicsWorld.gravity = CGVector(dx: 0, dy: 0)

    let tittleLabel = SKLabelNode(text: "Let the music play")
    tittleLabel.fontSize = 50
    tittleLabel.fontName = "Helvetica Nue"
    tittleLabel.fontColor = UIColor.white
    tittleLabel.position = CGPoint(x: 0, y: 600)
    addChild(tittleLabel)

    for _ in 1...5 {

        var frameWidthMulti = CGFloat(0)

        for _ in 1...3 {

            let pad = SKSpriteNode(color: UIColor.cyan, size: CGSize(width: 220, height: 220))
            pad.physicsBody = SKPhysicsBody(rectangleOf: pad.frame.size)
            pad.position = CGPoint(x: -240 + frameWidthMulti, y: -500 + frameHightMulti)
            pad.name = sounds[i-1]


            let nameLabel = SKLabelNode(text: pad.name)
            nameLabel.fontSize = 50
            nameLabel.fontName = "Helvetica Nue"
            nameLabel.fontColor = UIColor.black
            nameLabel.position = pad.position

            addChild(pad)

            addChild(nameLabel)

            frameWidthMulti += pad.size.width + 20
            i += 1
        }

        frameHightMulti +=  240


    }



}



override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    let touchLocation = touches.first?.location(in: self)

    if let body = self.physicsWorld.body(at: touchLocation!){

        if let z = body.node?.name {

            switch z {

            case "15":
                self.run(SKAction.playSoundFileNamed("15", waitForCompletion: false))
                print(z)
            case "14":
                self.run(SKAction.playSoundFileNamed("14", waitForCompletion: false))
                print(z)
            case "13":
                self.run(SKAction.playSoundFileNamed("13", waitForCompletion: false))
                print(z)
            case "12":
                self.run(SKAction.playSoundFileNamed("12", waitForCompletion: false))
                print(z)
            case "11":
                self.run(SKAction.playSoundFileNamed("11", waitForCompletion: false))
                print(z)
            case "Tom":
                self.run(SKAction.playSoundFileNamed("Tom", waitForCompletion: false))
                print(z)
            case "Crash":
                self.run(SKAction.playSoundFileNamed("Crash", waitForCompletion: false))
                print(z)
            case "Snap":
                self.run(SKAction.playSoundFileNamed("Snap", waitForCompletion: false))
                print(z)
            case "Chant":
                self.run(SKAction.playSoundFileNamed("Chant", waitForCompletion: false))
                print(z)
            case "Cow":
                self.run(SKAction.playSoundFileNamed("Cow", waitForCompletion: false))
                print(z)
            case "Snare":
                self.run(SKAction.playSoundFileNamed("Snare", waitForCompletion: false))
                print(z)
            case "OpHat":
                self.run(SKAction.playSoundFileNamed("OpHat", waitForCompletion: false))
                print(z)
            case "Hat":
                self.run(SKAction.playSoundFileNamed("Hat", waitForCompletion: false))
                print(z)
            case "Clap":
                self.run(SKAction.playSoundFileNamed("Clap", waitForCompletion: false))
                print(z)
            case "Kick":
                self.run(SKAction.playSoundFileNamed("Kick", waitForCompletion: false))
                print(z)

            default: print("Shit hpns")
            }

        }

    }

}

override func update(_ currentTime: TimeInterval) {
    // Called before each frame is rendered
}
}
导入SpriteKit
导入游戏工具包
进口AVF基金会
类游戏场景:SKScene{
变量i=1
let sounds=[“踢”、“拍”、“帽子”、“Opat”、“圈套”、“牛”、“撞车”、“啪”、“唱”、“汤姆”、“11”、“12”、“13”、“14”、“15”]
覆盖func didMove(到视图:SKView){
做{
声音中的声音{
让player=尝试使用AVAudioPlayer(contentsOf:URL(fileURLWithPath:Bundle.main.path(forResource:sound,of type:“wav”)!)作为URL)
player.prepareToPlay()
}
}抓住{
}
var frameHightMulti=CGFloat(0)
self.physicsWorld.gravity=CGVector(dx:0,dy:0)
let titleLabel=SKLabelNode(文本:“让音乐播放”)
TitleLabel.fontSize=50
titleLabel.fontName=“Helvetica Nue”
TitleLabel.fontColor=UIColor.white
tittleLabel.position=CGPoint(x:0,y:600)
addChild(标题标签)
对于1…5中的uu{
var frameWidthMulti=CGFloat(0)
对于1…3中的uu{
let pad=SKSpriteNode(颜色:UIColor.cyan,大小:CGSize(宽:220,高:220))
pad.physicsBody=SKPhysicsBody(矩形:pad.frame.size)
pad.position=CGPoint(x:-240+帧宽倍数,y:-500+帧高倍数)
pad.name=声音[i-1]
让namelab=SKLabelNode(文本:pad.name)
nameLabel.fontSize=50
namelab.fontName=“Helvetica Nue”
nameLabel.fontColor=UIColor.black
nameLabel.position=pad.position
addChild(pad)
addChild(名称标签)
frameWidthMulti+=pad.size.width+20
i+=1
}
frameHightMulti+=240
}
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
让touchLocation=touchs.first?位置(in:self)
如果让body=self.physicsWorld.body(在:touchLocation!){
如果设z=body.node?.name{
开关z{
案例“15”:
self.run(SKAction.playSoundFileNamed(“15”,waitForCompletion:false))
打印(z)
案例“14”:
self.run(SKAction.playSoundFileNamed(“14”,waitForCompletion:false))
打印(z)
案例“13”:
self.run(SKAction.playSoundFileNamed(“13”,waitForCompletion:false))
打印(z)
案例“12”:
self.run(SKAction.playSoundFileNamed(“12”,waitForCompletion:false))
打印(z)
案例“11”:
self.run(SKAction.playSoundFileNamed(“11”,waitForCompletion:false))
打印(z)
“汤姆”案:
self.run(SKAction.playsoundfilename(“Tom”,waitForCompletion:false))
打印(z)
“崩溃”案例:
self.run(SKAction.playSoundFileNamed(“Crash”,waitForCompletion:false))
打印(z)
案例“Snap”:
self.run(SKAction.playSoundFileNamed(“Snap”,waitForCompletion:false))
打印(z)
案例“圣歌”:
self.run(SKAction.playsoundfilename(“Chant”,waitForCompletion:false))
打印(z)
案例“奶牛”:
self.run(SKAction.playSoundFileNamed(“Cow”,waitForCompletion:false))
打印(z)
案例“圈套”:
self.run(SKAction.playSoundFileNamed(“Snare”,waitForCompletion:false))
打印(z)
“Opat”案:
self.run(SKAction.playSoundFileNamed(“opat”,waitForCompletion:false))
打印(z)
“帽子”一案:
self.run(SKAction.playSoundFileNamed(“Hat”,waitForCompletion:false))
打印(z)
案例“Clap”:
self.run(SKAction.playsoundfilename(“Clap”,waitForCompletion:false))
打印(z)
案例“踢”:
self.run(SKAction.playsoundfilename(“Kick”,waitForCompletion:false))
打印(z)
默认值:打印(“狗屎hpns”)
}
}
}
}
覆盖函数更新(uCurrentTime:TimeInterval){
//在渲染每个帧之前调用
}
}

AVAudioPlayer与SKAction不同,因此不需要调用do/catch方法来准备带有声音名称的AVAudioPlayer。AVAudioPlayer主要用于背景音乐

因此,您可以简单地调用SKAction,就像您在touchsbegind方法中所做的那样,而无需任何预设置。您通常会这样称呼它们,名称中有正确的文件扩展名

run(SKAction.playSoundFileNamed("Kick.wav", waitForCompletion: false))
作为提示,您应该将这些声音动作创建为类的属性,以便它们被预加载并准备好使用。如果您只是直接在touchesbeated方法中调用该操作,那么在首次需要预加载声音文件时,您很可能会看到一些延迟/口吃

试试这样的

 enum SoundName: String { // store sound names like this to avoid typos
     case kick = "Kick.wav"
     case klap = "Klap.wav"
     ...
 }

 var sounds = [String: SKAction]()
 var soundNames = [SoundName.kick.rawValue, SoundName.klap.rawValue, etc]
func didMove(to view: SKView) {

     for soundName in soundNames {
          let soundAction = SKAction.playSoundFileNamed(sound, waitForCompletion: false) 
          sounds.updateValue(soundAction, forKey: soundName)
     }
}
而不是你这样安排他们

 enum SoundName: String { // store sound names like this to avoid typos
     case kick = "Kick.wav"
     case klap = "Klap.wav"
     ...
 }

 var sounds = [String: SKAction]()
 var soundNames = [SoundName.kick.rawValue, SoundName.klap.rawValue, etc]
func didMove(to view: SKView) {

     for soundName in soundNames {
          let soundAction = SKAction.playSoundFileNamed(sound, waitForCompletion: false) 
          sounds.updateValue(soundAction, forKey: soundName)
     }
}
当你想玩的时候你可以这么说

if let sound = sounds[SoundName.kick.rawValue] { // safely unwrap dict value as it might not exist
    run(sound)
}
另外,请确保在创建精灵/焊盘时正确设置了节点名称,否则ToucheSStart中的switch语句将无法工作。 不知道为什么在那个位置有两个循环。检查该部分,确保您的焊盘具有正确的名称,使用打印语句查看发生了什么

在你的触摸方法中也尝试一下这个

   override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
       for touch in touches {
            let location = touch.location(in: self)
            let node = atPoint(location)

            if let nodeName = node.name {

                 switch nodeName {

                 case SoundName.kick.rawValue:
                       if let sound = sounds[SoundName.kick.rawValue] {
                          run(sound)
                        }  
                ...
                default:
                   break
            }
       }
  }
override func touchsbegind(touch:Set,带有事件:UIEvent?){
接触{
让loc