I've finished Project14 Day 56 but the sound isn't working.
Whenever I tap a penguin this error message shows up in the console output.
2022-11-22 16:54:11.419123-0700 Project14[12378:4368884] SKAction: Error loading sound resource: "whack.caf"
I have tried moving the sound files from assets to the project navigator, but it doesn't seem to work with the files in either location. Does anybody know how to make this work?
I am testing on the Simulator rather than an actual device. So, I don't know if that has anything to do with it.
This is the code if it helps...
GameScene.swift
import SpriteKit
import GameplayKit
class GameScene: SKScene {
var slots = [WhackSlot]()
var gameScore: SKLabelNode!
var numRounds = 0
var popupTime = 0.85
var score = 0 {
didSet {
gameScore.text = "Score: \(score)"
}
}
override func didMove(to view: SKView) {
let background = SKSpriteNode(imageNamed: "whackBackground")
background.position = CGPoint(x: 512, y: 384)
background.blendMode = .replace
background.zPosition = -1
addChild(background)
gameScore = SKLabelNode(fontNamed: "Chalkduster")
gameScore.text = "Score: 0"
gameScore.position = CGPoint(x: 8, y: 8)
gameScore.horizontalAlignmentMode = .left
gameScore.fontSize = 48
addChild(gameScore)
for i in 0 ..< 5 { createSlot(at: CGPoint(x: 100 + (i * 170), y: 410)) }
for i in 0 ..< 4 { createSlot(at: CGPoint(x: 180 + (i * 170), y: 320)) }
for i in 0 ..< 5 { createSlot(at: CGPoint(x: 100 + (i * 170), y: 230)) }
for i in 0 ..< 4 { createSlot(at: CGPoint(x: 180 + (i * 170), y: 140)) }
DispatchQueue.main.asyncAfter(deadline: .now() + 1) { [weak self] in
self?.createEnemy()
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let location = touch.location(in: self)
let tappedNodes = nodes(at: location)
for node in tappedNodes {
guard let whackSlot = node.parent?.parent as? WhackSlot else { continue }
if !whackSlot.isVisible { continue }
if whackSlot.isHit { continue }
whackSlot.hit()
if node.name == "charFriend" {
score -= 5
run(SKAction.playSoundFileNamed("whackBad.caf", waitForCompletion: false))
} else if node.name == "charEnemy" {
whackSlot.charNode.xScale = 0.85
whackSlot.charNode.yScale = 0.85
score += 1
run(SKAction.playSoundFileNamed("whack.caf", waitForCompletion: false))
}
}
}
func createSlot(at position: CGPoint) {
let slot = WhackSlot()
slot.configure(at: position)
addChild(slot)
slots.append(slot)
}
func createEnemy() {
numRounds += 1
if numRounds >= 30 {
for slot in slots {
slot.hide()
}
let gameOver = SKSpriteNode(imageNamed: "gameOver")
gameOver.position = CGPoint(x: 512, y: 384)
gameOver.zPosition = 1
addChild(gameOver)
return
}
popupTime *= 0.991
slots.shuffle()
slots[0].show(hideTime: popupTime)
if Int.random(in: 0...12) > 4 { slots[1].show(hideTime: popupTime) }
if Int.random(in: 0...12) > 8 { slots[2].show(hideTime: popupTime) }
if Int.random(in: 0...12) > 10 { slots[3].show(hideTime: popupTime) }
if Int.random(in: 0...12) > 11 { slots[4].show(hideTime: popupTime) }
let minDelay = popupTime / 2.0
let maxDelay = popupTime * 2
let delay = Double.random(in: minDelay...maxDelay)
DispatchQueue.main.asyncAfter(deadline: .now() + delay) { [weak self] in
self?.createEnemy()
}
}
}
WhackSlot.swift
import SpriteKit
import UIKit
class WhackSlot: SKNode {
var charNode: SKSpriteNode!
var isVisible = false
var isHit = false
func configure(at position: CGPoint) {
self.position = position
let sprite = SKSpriteNode(imageNamed: "whackHole")
let cropNode = SKCropNode()
cropNode.position = CGPoint(x: 0, y: 15)
cropNode.zPosition = 1
cropNode.maskNode = SKSpriteNode(imageNamed: "whackMask")
charNode = SKSpriteNode(imageNamed: "penguinGood")
charNode.position = CGPoint(x: 0, y: -90)
charNode.name = "character"
cropNode.addChild(charNode)
addChild(cropNode)
addChild(sprite)
}
func show(hideTime: Double) {
if isVisible { return }
charNode.xScale = 1
charNode.yScale = 1
charNode.run(SKAction.moveBy(x: 0, y: 80, duration: 0.05))
isVisible = true
isHit = false
if Int.random(in: 0...2) == 0 {
charNode.texture = SKTexture(imageNamed: "penguinGood")
charNode.name = "charFriend"
} else {
charNode.texture = SKTexture(imageNamed: "penguinEvil")
charNode.name = "charEnemy"
}
DispatchQueue.main.asyncAfter(deadline: .now() + (hideTime * 3.5)) { [weak self] in
self?.hide()
}
}
func hide() {
if !isVisible { return }
charNode.run(SKAction.moveBy(x: 0, y: -80, duration: 0.05))
isVisible = false
}
func hit() {
isHit = true
let delay = SKAction.wait(forDuration: 0.25)
let hide = SKAction.moveBy(x: 0, y: -80, duration: 0.5)
let notVisible = SKAction.run { [unowned self] in
self.isVisible = false
}
charNode.run(SKAction.sequence([delay, hide, notVisible]))
}
}