Error. Please help if ya can:!

I am an inventor, apps are totally different! I need help from someone kind please. I am trying to change the scene after my game hits max score. To a scene named NewScene here is the code for GameScene, GameView Controller and NewScene. I get the error on NewScene the error is "if let cookie2 = level!.cookieAtColumn2(column, row: row){" Stating EXC_BAD_INSTRUCTION (code = EXC_I386_INVOP, subcode = 0x0) is this because i created a cookie2.swift file and linked the cookie to cookie2 instead? same with cookieAtColumn? Because the error was still appearing before i changed from cookie to cookie2.. I really have no idea why it is this difficult to start a new level. After game over ends it shows the LevelComplete button but then invokes the code ^^-EXC_BAD_INS.... If anyone has any knowledge or understanding on swift xcode please give input, any advice will be greatly valued. My email is also jackcoyle23@yahoo.com if need be.


Here's the code;


GAMESCENE

import SpriteKit

class GameScene: SKScene {


var score = 0

/

/

/

var level: level1!

/

/

/

/

var swipeHandler: ((Swap) -> ())?

let TileWidth: CGFloat = 32.0

let TileHeight: CGFloat = 36.0

let gameLayer = SKNode()

let cookiesLayer = SKNode()

let tilesLayer = SKNode()

let cropLayer = SKCropNode()

let maskLayer = SKNode()

/

/

/

var swipeFromColumn: Int?

var swipeFromRow: Int?

/

var selectionSprite = SKSpriteNode()

/

let swapSound = SKAction.playSoundFileNamed("Chomp.wav", waitForCompletion: false)

let invalidSwapSound = SKAction.playSoundFileNamed("Error.wav", waitForCompletion: false)

let matchSound = SKAction.playSoundFileNamed("Ka-Ching.wav", waitForCompletion: false)

let fallingCookieSound = SKAction.playSoundFileNamed("Scrape.wav", waitForCompletion: false)

let addCookieSound = SKAction.playSoundFileNamed("Drip.wav", waitForCompletion: false)

/

required init?(coder aDecoder: NSCoder) {

fatalError("init(coder) is not used in this app")

}

override init(size: CGSize) {

super.init(size: size)

anchorPoint = CGPoint(x: 0.5, y: 0.5)

/

/

let background = SKSpriteNode(imageNamed: "Background")

addChild(background)




/

/

gameLayer.hidden = true

addChild(gameLayer)

let layerPosition = CGPoint(

x: -TileWidth * CGFloat(NumColumns) / 2,

y: -TileHeight * CGFloat(NumRows) / 2)

/

/

tilesLayer.position = layerPosition

gameLayer.addChild(tilesLayer)

/

/

gameLayer.addChild(cropLayer)

/

maskLayer.position = layerPosition

cropLayer.maskNode = maskLayer

/

/

cookiesLayer.position = layerPosition

cropLayer.addChild(cookiesLayer)

/

swipeFromColumn = nil

swipeFromRow = nil

/

SKLabelNode(fontNamed: "GillSans-BoldItalic")

}

func addSpritesForCookies(cookies: Set<Cookie>) {

for cookie in cookies {

/

let sprite = SKSpriteNode(imageNamed: cookie.cookieType.spriteName)

sprite.position = pointForColumn(cookie.column, row:cookie.row)

cookiesLayer.addChild(sprite)

cookie.sprite = sprite

/

sprite.alpha = 0

sprite.xScale = 0.5

sprite.yScale = 0.5

sprite.runAction(

SKAction.sequence([

SKAction.waitForDuration(0.25, withRange: 0.5),

SKAction.group([

SKAction.fadeInWithDuration(0.25),

SKAction.scaleTo(1.0, duration: 0.25)

])

]))

}

}

func removeAllCookieSprites() {

cookiesLayer.removeAllChildren()

}

func addTiles() {



for row in 0..<NumRows {

for column in 0..<NumColumns {

/

/

if level!.tileAtColumn(column, row: row) != nil {

let tileNode = SKSpriteNode(imageNamed: "MaskTile")

tileNode.position = pointForColumn(column, row: row)

maskLayer.addChild(tileNode)

}

}

}

/

/

for row in 0...NumRows {

for column in 0...NumColumns {

let topLeft = (column > 0) && (row < NumRows)

&& level.tileAtColumn(column - 1, row: row) != nil

let bottomLeft = (column > 0) && (row > 0)

&& level.tileAtColumn(column - 1, row: row - 1) != nil

let topRight = (column < NumColumns) && (row < NumRows)

&& level.tileAtColumn(column, row: row) != nil

let bottomRight = (column < NumColumns) && (row > 0)

&& level.tileAtColumn(column, row: row - 1) != nil

/

/

let value = Int(topLeft) | Int(topRight) << 1 | Int(bottomLeft) << 2 | Int(bottomRight) << 3

/

if value != 0 && value != 6 && value != 9 {

let name = String(format: "Tile_%ld", value)

let tileNode = SKSpriteNode(imageNamed: name)

var point = pointForColumn(column, row: row)

point.x -= TileWidth/2

point.y -= TileHeight/2

tileNode.position = point

tilesLayer.addChild(tileNode)

}

}

}

}

/

/

func pointForColumn(column: Int, row: Int) -> CGPoint {

return CGPoint(

x: CGFloat(column)*TileWidth + TileWidth/2,

y: CGFloat(row)*TileHeight + TileHeight/2)

}

/

func convertPoint(point: CGPoint) -> (success: Bool, column: Int, row: Int) {

/

/

if point.x >= 0 && point.x < CGFloat(NumColumns)*TileWidth &&

point.y >= 0 && point.y < CGFloat(NumRows)*TileHeight {

return (true, Int(point.x / TileWidth), Int(point.y / TileHeight))

} else {

return (false, 0, 0) /

}

}

/

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

/

let touch = touches.first as UITouch!

let location = touch.locationInNode(cookiesLayer)


/

/

let (success, column, row) = convertPoint(location)

if success {

/

if let cookie = level!.cookieAtColumn(column, row: row) {

/

/

/

swipeFromColumn = column

swipeFromRow = row

showSelectionIndicatorForCookie(cookie)


if score >= level.targetScore {




}}

}

}

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {

/

/

/

if swipeFromColumn == nil { return }

let touch = touches.first as UITouch!

let location = touch.locationInNode(cookiesLayer)

let (success, column, row) = convertPoint(location)

if success {

/

/

var horzDelta = 0, vertDelta = 0

if column < swipeFromColumn! { /

horzDelta = -1

} else if column > swipeFromColumn! { /

horzDelta = 1

} else if row < swipeFromRow! { /

vertDelta = -1

} else if row > swipeFromRow! { /

vertDelta = 1

}

/

if horzDelta != 0 || vertDelta != 0 {

trySwapHorizontal(horzDelta, vertical: vertDelta)

hideSelectionIndicator()

/

swipeFromColumn = nil

}

}

}

/

/

/

/

func trySwapHorizontal(horzDelta: Int, vertical vertDelta: Int) {

let toColumn = swipeFromColumn! + horzDelta

let toRow = swipeFromRow! + vertDelta

/

/

if toColumn < 0 || toColumn >= NumColumns { return }

if toRow < 0 || toRow >= NumRows { return }

/

/

if let toCookie = level.cookieAtColumn(toColumn, row: toRow),

let fromCookie = level.cookieAtColumn(swipeFromColumn!, row: swipeFromRow!),

let handler = swipeHandler {

/

let swap = Swap(cookieA: fromCookie, cookieB: toCookie)

handler(swap)

}

}



override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {

/

/

if selectionSprite.parent != nil && swipeFromColumn != nil {

hideSelectionIndicator()

}

/

/

swipeFromColumn = nil

swipeFromRow = nil

}


override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {

touchesEnded(touches!, withEvent: event)

}

/

func animateSwap(swap: Swap, completion: () -> ()) {

let spriteA = swap.cookieA.sprite!

let spriteB = swap.cookieB.sprite!

/

spriteA.zPosition = 100

spriteB.zPosition = 90

let Duration: NSTimeInterval = 0.3

let moveA = SKAction.moveTo(spriteB.position, duration: Duration)

moveA.timingMode = .EaseOut

spriteA.runAction(moveA, completion: completion)

let moveB = SKAction.moveTo(spriteA.position, duration: Duration)

moveB.timingMode = .EaseOut

spriteB.runAction(moveB)

runAction(swapSound)

}

func animateInvalidSwap(swap: Swap, completion: () -> ()) {

let spriteA = swap.cookieA.sprite!

let spriteB = swap.cookieB.sprite!

spriteA.zPosition = 100

spriteB.zPosition = 90

let Duration: NSTimeInterval = 0.2

let moveA = SKAction.moveTo(spriteB.position, duration: Duration)

moveA.timingMode = .EaseOut

let moveB = SKAction.moveTo(spriteA.position, duration: Duration)

moveB.timingMode = .EaseOut

spriteA.runAction(SKAction.sequence([moveA, moveB]), completion: completion)

spriteB.runAction(SKAction.sequence([moveB, moveA]))

runAction(invalidSwapSound)

}

func animateMatchedCookies(chains: Set<Chain>, completion: () -> ()) {

for chain in chains {

animateScoreForChain(chain)

for cookie in chain.cookies {

/

/

/

if let sprite = cookie.sprite {

if sprite.actionForKey("removing") == nil {

let scaleAction = SKAction.scaleTo(0.1, duration: 0.3)

scaleAction.timingMode = .EaseOut

sprite.runAction(SKAction.sequence([scaleAction, SKAction.removeFromParent()]),

withKey:"removing")

}

}

}

}

runAction(matchSound)

/

runAction(SKAction.waitForDuration(0.3), completion: completion)

}

func animateScoreForChain(chain: Chain) {

/

let firstSprite = chain.firstCookie().sprite!

let lastSprite = chain.lastCookie().sprite!

let centerPosition = CGPoint(

x: (firstSprite.position.x + lastSprite.position.x)/2,

y: (firstSprite.position.y + lastSprite.position.y)/2 - 8)

/

let scoreLabel = SKLabelNode(fontNamed: "GillSans-BoldItalic")

scoreLabel.fontSize = 16

scoreLabel.text = String(format: "%ld", chain.score)

scoreLabel.position = centerPosition

scoreLabel.zPosition = 300

cookiesLayer.addChild(scoreLabel)

let moveAction = SKAction.moveBy(CGVector(dx: 0, dy: 3), duration: 0.7)

moveAction.timingMode = .EaseOut

scoreLabel.runAction(SKAction.sequence([moveAction, SKAction.removeFromParent()]))

}

func animateFallingCookies(columns: [[Cookie]], completion: () -> ()) {

var longestDuration: NSTimeInterval = 0

for array in columns {

for (idx, cookie) in array.enumerate() {

let newPosition = pointForColumn(cookie.column, row: cookie.row)

/

/

let delay = 0.05 + 0.15*NSTimeInterval(idx)

let sprite = cookie.sprite! /

/

/

let duration = NSTimeInterval(((sprite.position.y - newPosition.y) / TileHeight) * 0.1)

longestDuration = max(longestDuration, duration + delay)

let moveAction = SKAction.moveTo(newPosition, duration: duration)

moveAction.timingMode = .EaseOut

sprite.runAction(

SKAction.sequence([

SKAction.waitForDuration(delay),

SKAction.group([moveAction, fallingCookieSound])]))

}

}

/

runAction(SKAction.waitForDuration(longestDuration), completion: completion)

}

func animateNewCookies(columns: [[Cookie]], completion: () -> ()) {

/

/

/

var longestDuration: NSTimeInterval = 0

for array in columns {

/

/

/

let startRow = array[0].row + 1

for (idx, cookie) in array.enumerate() {

/

let sprite = SKSpriteNode(imageNamed: cookie.cookieType.spriteName)

sprite.position = pointForColumn(cookie.column, row: startRow)

cookiesLayer.addChild(sprite)

cookie.sprite = sprite

/

/

let delay = 0.1 + 0.2 * NSTimeInterval(array.count - idx - 1)

/

let duration = NSTimeInterval(startRow - cookie.row) * 0.1

longestDuration = max(longestDuration, duration + delay)

/

/

let newPosition = pointForColumn(cookie.column, row: cookie.row)

let moveAction = SKAction.moveTo(newPosition, duration: duration)

moveAction.timingMode = .EaseOut

sprite.alpha = 0

sprite.runAction(

SKAction.sequence([

SKAction.waitForDuration(delay),

SKAction.group([

SKAction.fadeInWithDuration(0.05),

moveAction,

addCookieSound])

]))

}

}

/

runAction(SKAction.waitForDuration(longestDuration), completion: completion)

}

func animateGameOver(completion: () -> ()) {

let action = SKAction.moveBy(CGVector(dx: 0, dy: -size.height), duration: 0.3)

action.timingMode = .EaseIn

gameLayer.runAction(action, completion: completion)

}

func animateBeginGame(completion: () -> ()) {

gameLayer.hidden = false

gameLayer.position = CGPoint(x: 0, y: size.height)

let action = SKAction.moveBy(CGVector(dx: 0, dy: -size.height), duration: 0.3)

action.timingMode = .EaseOut

gameLayer.runAction(action, completion: completion)


}



/

func showSelectionIndicatorForCookie(cookie: Cookie) {

/

if selectionSprite.parent != nil {

selectionSprite.removeFromParent()

}

/

/

/

if let sprite = cookie.sprite {

let texture = SKTexture(imageNamed: cookie.cookieType.highlightedSpriteName)

selectionSprite.size = texture.size()

selectionSprite.runAction(SKAction.setTexture(texture))

sprite.addChild(selectionSprite)

selectionSprite.alpha = 1.0

}

}


func hideSelectionIndicator() {

selectionSprite.runAction(SKAction.sequence([

SKAction.fadeOutWithDuration(0.3),

SKAction.removeFromParent()]))

}

}


GAMEVIEWCONTROLLER, GAMEVIEWCONTROLLER, GAMEVIEWCONTROLLER, GAMEVIEWCONTROLLER:)


GAMEVIEWCONTROLLER, GAMEVIEWCONTROLLER, GAMEVIEWCONTROLLER, GAMEVIEWCONTROLLER:)

GAMEVIEWCONTROLLER, GAMEVIEWCONTROLLER, GAMEVIEWCONTROLLER, GAMEVIEWCONTROLLER:)

GAMEVIEWCONTROLLER, GAMEVIEWCONTROLLER, GAMEVIEWCONTROLLER, GAMEVIEWCONTROLLER:)

import UIKit

import SpriteKit

import AVFoundation

class GameViewController: UIViewController {


/

var scene: GameScene!


var scene2: NewScene!


var skView: SKView?



/

/

var level: level1!


var level2: level3!

var movesLeft = 0

var score = 0

@IBOutlet weak var targetLabel: UILabel!

@IBOutlet weak var movesLabel: UILabel!

@IBOutlet weak var scoreLabel: UILabel!

@IBOutlet weak var gameOverPanel: UIImageView!

@IBOutlet weak var shuffleButton: UIButton!


var tapGestureRecognizer: UITapGestureRecognizer!

lazy var backgroundMusic: AVAudioPlayer = {

let url = NSBundle.mainBundle().URLForResource("FantasyTheme", withExtension: "wav")

let player = try? AVAudioPlayer(contentsOfURL: url!)

player!.numberOfLoops = -1

return player!

}()

override func prefersStatusBarHidden() -> Bool {

return true

}

override func shouldAutorotate() -> Bool {

return true

}

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {

return UIInterfaceOrientationMask.AllButUpsideDown

}

override func viewDidLoad() {

super.viewDidLoad()

/

let skView = view as! SKView

skView.multipleTouchEnabled = false

/

scene = GameScene(size: skView.bounds.size)

scene.scaleMode = .AspectFill


scene2 = NewScene(size:skView.bounds.size)

scene2.scaleMode = .AspectFill

/

level = level1(filename: "Level_1")

scene.level = level

scene.addTiles()

scene.swipeHandler = handleSwipe


level2 = level3(filename: "Level_2")

scene.level = level

scene.addTiles()

scene.swipeHandler = handleSwipe


/

gameOverPanel.hidden = true

shuffleButton.hidden = true

/


skView.presentScene(scene)


/

backgroundMusic.play()

/

beginGame()

}

func beginGame() {

movesLeft = level.maximumMoves

score = 0

updateLabels()

level.resetComboMultiplier()

scene.animateBeginGame() {

self.shuffleButton.hidden = false

}

shuffle()

}

func beginGame2() {

movesLeft = level2.maximumMoves

score = 0

updateLabels()


level2.resetComboMultiplier()


scene2.animateBeginGame2() {

self.shuffleButton.hidden = false

}


shuffle()

}



func shuffle() {

/

scene.removeAllCookieSprites()

/

let newCookies = level.shuffle()

scene.addSpritesForCookies(newCookies)



}


func shuffle2() {

/

scene2.removeAllCookieSprites()


/

let newCookies2 = level2.shuffle()

scene2.addSpritesForCookies(newCookies2)



}


/

/

func handleSwipe(swap: Swap) {

/

/

view.userInteractionEnabled = false

if level.isPossibleSwap(swap) {

level.performSwap(swap)

scene.animateSwap(swap, completion: handleMatches)

} else {

scene.animateInvalidSwap(swap) {

self.view.userInteractionEnabled = true

}}


func handleSwipe2(swap: Swap) {

/

/

view.userInteractionEnabled = false


if level2.isPossibleSwap(swap) {

level2.performSwap(swap)

scene2.animateSwap(swap, completion: handleMatches)

} else {

scene2.animateInvalidSwap(swap) {

self.view.userInteractionEnabled = true

}

}

}

}

/

/

/

func handleMatches() {

/

let chains = level.removeMatches()


if chains.count == 0 {

beginNextTurn()

return

}


func handleMatches2() {

/

let chains2 = level2.removeMatches()


/

if chains2.count == 0 {

beginNextTurn()

return

}}



/

scene.animateMatchedCookies(chains) {

/

for chain in chains {

self.score += chain.score

}

self.updateLabels()

/

let columns = self.level.fillHoles()

self.scene.animateFallingCookies(columns) {

/

let columns = self.level.topUpCookies()

self.scene.animateNewCookies(columns) {

/

self.handleMatches()

}



self.scene2.animateMatchedCookies(chains) {


/

for chain in chains {

self.score += chain.score

}

self.updateLabels()


/

let columns2 = self.level2.fillHoles()

self.scene2.animateFallingCookies(columns) {


/

let columns2 = self.level2.topUpCookies()

self.scene2.animateNewCookies(columns) {


/

self.handleMatches()

}

}

}

}}}

func beginNextTurn() {

level.resetComboMultiplier()

level.detectPossibleSwaps()

view.userInteractionEnabled = true

decrementMoves()

}


func beginNextTurn2() {

level2.resetComboMultiplier()

level2.detectPossibleSwaps()

view.userInteractionEnabled = true

decrementMoves()

}



func updateLabels() {

targetLabel.text = String(format: "%ld", level.targetScore)

movesLabel.text = String(format: "%ld", movesLeft)

scoreLabel.text = String(format: "%ld", score)

}


func updateLabels2() {

targetLabel.text = String(format: "%ld", level2.targetScore)

movesLabel.text = String(format: "%ld", movesLeft)

scoreLabel.text = String(format: "%ld", score)

}



func decrementMoves() {

--movesLeft

updateLabels()

if score >= level.targetScore {

gameOverPanel.image = UIImage(named: "LevelComplete")

showGameOver()



let skView = self.view as! SKView

let scene = NewScene(size: skView.bounds.size)


skView.ignoresSiblingOrder = true

skView.multipleTouchEnabled = true

scene.scaleMode = .AspectFill

skView.presentScene(scene)




if score >= level2.targetScore {

gameOverPanel.image = UIImage(named: "LevelComplete")

showGameOver()

}

}else if movesLeft == 0 {

gameOverPanel.image = UIImage(named: "GameOver")

showGameOver()

}

}

func showGameOver() {

gameOverPanel.hidden = false

scene.userInteractionEnabled = false

shuffleButton.hidden = true

scene.animateGameOver() {

self.tapGestureRecognizer = UITapGestureRecognizer(target: self, action: "hideGameOver")

self.view.addGestureRecognizer(self.tapGestureRecognizer)


}

}

func showGameOver2() {

gameOverPanel.hidden = false

scene2.userInteractionEnabled = false

shuffleButton.hidden = true


scene.animateGameOver() {

self.tapGestureRecognizer = UITapGestureRecognizer(target: self, action: "hideGameOver")

self.view.addGestureRecognizer(self.tapGestureRecognizer)

}

}

func hideGameOver() {

view.removeGestureRecognizer(tapGestureRecognizer)

tapGestureRecognizer = nil

gameOverPanel.hidden = true

scene.userInteractionEnabled = true

beginGame()

}


func hideGameOver2() {

view.removeGestureRecognizer(tapGestureRecognizer)

tapGestureRecognizer = nil


gameOverPanel.hidden = true

scene2.userInteractionEnabled = true


beginGame()

}


@IBAction func shuffleButtonPressed(_: AnyObject) {

shuffle()


/

decrementMoves()

}}


NEWSCENE, NEWSCENE, NEWSCENE, NEWSCENE, NEWSCENE, NEWSCENE, NEWSCENE, NEWSCENE:)


NEWSCENE, NEWSCENE, NEWSCENE, NEWSCENE, NEWSCENE, NEWSCENE, NEWSCENE, NEWSCENE:)

NEWSCENE, NEWSCENE, NEWSCENE, NEWSCENE, NEWSCENE, NEWSCENE, NEWSCENE, NEWSCENE:)

NEWSCENE, NEWSCENE, NEWSCENE, NEWSCENE, NEWSCENE, NEWSCENE, NEWSCENE, NEWSCENE:)

import SpriteKit

var score = 0

class NewScene: SKScene {

/

/

/

var level: level3!

/

/

/

/

var swipeHandler2: ((Swap) -> ())?

let TileWidth: CGFloat = 32.0

let TileHeight: CGFloat = 36.0

let gameLayer = SKNode()

let cookiesLayer2 = SKNode()

let tilesLayer = SKNode()

let cropLayer = SKCropNode()

let maskLayer = SKNode()

/

/

/

var swipeFromColumn: Int?

var swipeFromRow: Int?

/

var selectionSprite = SKSpriteNode()

/

let swapSound = SKAction.playSoundFileNamed("Chomp.wav", waitForCompletion: false)

let invalidSwapSound = SKAction.playSoundFileNamed("Error.wav", waitForCompletion: false)

let matchSound = SKAction.playSoundFileNamed("Ka-Ching.wav", waitForCompletion: false)

let fallingCookieSound = SKAction.playSoundFileNamed("Scrape.wav", waitForCompletion: false)

let addCookieSound = SKAction.playSoundFileNamed("Drip.wav", waitForCompletion: false)

/

required init?(coder aDecoder: NSCoder) {

fatalError("init(coder) is not used in this app")

}


override init(size: CGSize) {

super.init(size: size)

anchorPoint = CGPoint(x: 0.5, y: 0.5)

/

/

let background2 = SKSpriteNode(imageNamed: "walker")

addChild(background2)

/

/

gameLayer.hidden = true

addChild(gameLayer)

let layerPosition = CGPoint(

x: -TileWidth * CGFloat(NumColumns) / 2,

y: -TileHeight * CGFloat(NumRows) / 2)

/

/

tilesLayer.position = layerPosition

gameLayer.addChild(tilesLayer)

/

/

gameLayer.addChild(cropLayer)

/

maskLayer.position = layerPosition

cropLayer.maskNode = maskLayer

/

/

cookiesLayer2.position = layerPosition

cropLayer.addChild(cookiesLayer2)

/

swipeFromColumn = nil

swipeFromRow = nil

/

SKLabelNode(fontNamed: "GillSans-BoldItalic")

}

func addSpritesForCookies(cookies: Set<Cookie>) {

for cookie2 in cookies {

/

let sprite2 = SKSpriteNode(imageNamed: cookie2.cookieType.spriteName)

sprite2.position = pointForColumn(cookie2.column, row:cookie2.row)

cookiesLayer2.addChild(sprite2)

cookie2.sprite = sprite2

/

sprite2.alpha = 0

sprite2.xScale = 0.5

sprite2.yScale = 0.5

sprite2.runAction(

SKAction.sequence([

SKAction.waitForDuration(0.25, withRange: 0.5),

SKAction.group([

SKAction.fadeInWithDuration(0.25),

SKAction.scaleTo(1.0, duration: 0.25)

])

]))

}

}

func removeAllCookieSprites() {

cookiesLayer2.removeAllChildren()

}

func addTiles() {


for row in 0..<NumRows {

for column in 0..<NumColumns {

/

/

if level!.tileAtColumn(column, row: row) != nil {

let tileNode = SKSpriteNode(imageNamed: "MaskTile")

tileNode.position = pointForColumn(column, row: row)

maskLayer.addChild(tileNode)

}

}

}

/

/

for row in 0...NumRows {

for column in 0...NumColumns {

let topLeft = (column > 0) && (row < NumRows)

&& level.tileAtColumn(column - 1, row: row) != nil

let bottomLeft = (column > 0) && (row > 0)

&& level.tileAtColumn(column - 1, row: row - 1) != nil

let topRight = (column < NumColumns) && (row < NumRows)

&& level.tileAtColumn(column, row: row) != nil

let bottomRight = (column < NumColumns) && (row > 0)

&& level.tileAtColumn(column, row: row - 1) != nil

/

/

let value = Int(topLeft) | Int(topRight) << 1 | Int(bottomLeft) << 2 | Int(bottomRight) << 3

/

if value != 0 && value != 6 && value != 9 {

let name = String(format: "Tile_%ld", value)

let tileNode = SKSpriteNode(imageNamed: name)

var point = pointForColumn(column, row: row)

point.x -= TileWidth/2

point.y -= TileHeight/2

tileNode.position = point

tilesLayer.addChild(tileNode)

}

}

}

}

/

/

func pointForColumn(column: Int, row: Int) -> CGPoint {

return CGPoint(

x: CGFloat(column)*TileWidth + TileWidth/2,

y: CGFloat(row)*TileHeight + TileHeight/2)

}

/

func convertPoint(point: CGPoint) -> (success: Bool, column: Int, row: Int) {

/

/

if point.x >= 0 && point.x < CGFloat(NumColumns)*TileWidth &&

point.y >= 0 && point.y < CGFloat(NumRows)*TileHeight {

return (true, Int(point.x / TileWidth), Int(point.y / TileHeight))

} else {

return (false, 0, 0) /

}

}

/


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

/


let touch2 = touches.first as UITouch!

let location2 = touch2.locationInNode(cookiesLayer2)



/

/

let (success, column, row) = convertPoint(location2)

if success {




/

if let cookie2 = level!.cookieAtColumn2(column, row: row){


/

/

/

swipeFromColumn = column

swipeFromRow = row


showSelectionIndicatorForCookie(cookie2)

}

}

}

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {

/

/

/

if swipeFromColumn == nil { return }

let touch2 = touches.first as UITouch!

let location2 = touch2.locationInNode(cookiesLayer2)

let (success, column, row) = convertPoint(location2)

if success {

/

/

var horzDelta = 0, vertDelta = 0

if column < swipeFromColumn! { /

horzDelta = -1

} else if column > swipeFromColumn! { /

horzDelta = 1

} else if row < swipeFromRow! { /

vertDelta = -1

} else if row > swipeFromRow! { /

vertDelta = 1

}

/

if horzDelta != 0 || vertDelta != 0 {

trySwapHorizontal(horzDelta, vertical: vertDelta)

hideSelectionIndicator()

/

swipeFromColumn = nil

}

}

}

/

/

/

/

func trySwapHorizontal(horzDelta: Int, vertical vertDelta: Int) {

let toColumn = swipeFromColumn! + horzDelta

let toRow = swipeFromRow! + vertDelta

/

/

if toColumn < 0 || toColumn >= NumColumns { return }

if toRow < 0 || toRow >= NumRows { return }

/

/

if let toCookie = level!.cookieAtColumn2(toColumn, row: toRow) {

if let fromCookie = level!.cookieAtColumn2(swipeFromColumn!, row: swipeFromRow!) {

let handler2 = swipeHandler2

/


if let handler2 = swipeHandler2 {


let swap = Swap(cookieA: fromCookie, cookieB: toCookie)

handler2(swap)

}

}

}

}

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {

/

/

if selectionSprite.parent != nil && swipeFromColumn != nil {

hideSelectionIndicator()

}

/

/

swipeFromColumn = nil

swipeFromRow = nil

}

override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {

touchesEnded(touches!, withEvent: event)

}

/

func animateSwap(swap: Swap, completion: () -> ()) {

let spriteA = swap.cookieA.sprite!

let spriteB = swap.cookieB.sprite!

/

spriteA.zPosition = 100

spriteB.zPosition = 90

let Duration: NSTimeInterval = 0.3

let moveA = SKAction.moveTo(spriteB.position, duration: Duration)

moveA.timingMode = .EaseOut

spriteA.runAction(moveA, completion: completion)

let moveB = SKAction.moveTo(spriteA.position, duration: Duration)

moveB.timingMode = .EaseOut

spriteB.runAction(moveB)

runAction(swapSound)

}

func animateInvalidSwap(swap: Swap, completion: () -> ()) {

let spriteA = swap.cookieA.sprite!

let spriteB = swap.cookieB.sprite!

spriteA.zPosition = 100

spriteB.zPosition = 90

let Duration: NSTimeInterval = 0.2

let moveA = SKAction.moveTo(spriteB.position, duration: Duration)

moveA.timingMode = .EaseOut

let moveB = SKAction.moveTo(spriteA.position, duration: Duration)

moveB.timingMode = .EaseOut

spriteA.runAction(SKAction.sequence([moveA, moveB]), completion: completion)

spriteB.runAction(SKAction.sequence([moveB, moveA]))

runAction(invalidSwapSound)

}

func animateMatchedCookies(chains: Set<Chain>, completion: () -> ()) {

for chain in chains {

animateScoreForChain(chain)

for cookie in chain.cookies {

/

/

/

if let sprite = cookie.sprite {

if sprite.actionForKey("removing") == nil {

let scaleAction = SKAction.scaleTo(0.1, duration: 0.3)

scaleAction.timingMode = .EaseOut

sprite.runAction(SKAction.sequence([scaleAction, SKAction.removeFromParent()]),

withKey:"removing")

}

}

}

}

runAction(matchSound)

/

runAction(SKAction.waitForDuration(0.3), completion: completion)

}

func animateScoreForChain(chain: Chain) {

/

let firstSprite = chain.firstCookie().sprite!

let lastSprite = chain.lastCookie().sprite!

let centerPosition = CGPoint(

x: (firstSprite.position.x + lastSprite.position.x)/2,

y: (firstSprite.position.y + lastSprite.position.y)/2 - 8)

/

let scoreLabel = SKLabelNode(fontNamed: "GillSans-BoldItalic")

scoreLabel.fontSize = 16

scoreLabel.text = String(format: "%ld", chain.score)

scoreLabel.position = centerPosition

scoreLabel.zPosition = 300

cookiesLayer2.addChild(scoreLabel)

let moveAction = SKAction.moveBy(CGVector(dx: 0, dy: 3), duration: 0.7)

moveAction.timingMode = .EaseOut

scoreLabel.runAction(SKAction.sequence([moveAction, SKAction.removeFromParent()]))

}

func animateFallingCookies(columns: [[Cookie]], completion: () -> ()) {

var longestDuration: NSTimeInterval = 0

for array in columns {

for (idx, cookie) in array.enumerate() {

let newPosition = pointForColumn(cookie.column, row: cookie.row)

/

/

let delay = 0.05 + 0.15*NSTimeInterval(idx)

let sprite = cookie.sprite! /

/

/

let duration = NSTimeInterval(((sprite.position.y - newPosition.y) / TileHeight) * 0.1)

longestDuration = max(longestDuration, duration + delay)

let moveAction = SKAction.moveTo(newPosition, duration: duration)

moveAction.timingMode = .EaseOut

sprite.runAction(

SKAction.sequence([

SKAction.waitForDuration(delay),

SKAction.group([moveAction, fallingCookieSound])]))

}

}

/

runAction(SKAction.waitForDuration(longestDuration), completion: completion)

}

func animateNewCookies(columns: [[Cookie]], completion: () -> ()) {

/

/

/

var longestDuration: NSTimeInterval = 0

for array in columns {

/

/

/

let startRow = array[0].row + 1

for (idx, cookie) in array.enumerate() {

/

let sprite = SKSpriteNode(imageNamed: cookie.cookieType.spriteName)

sprite.position = pointForColumn(cookie.column, row: startRow)

cookiesLayer2.addChild(sprite)

cookie.sprite = sprite

/

/

let delay = 0.1 + 0.2 * NSTimeInterval(array.count - idx - 1)

/

let duration = NSTimeInterval(startRow - cookie.row) * 0.1

longestDuration = max(longestDuration, duration + delay)

/

/

let newPosition = pointForColumn(cookie.column, row: cookie.row)

let moveAction = SKAction.moveTo(newPosition, duration: duration)

moveAction.timingMode = .EaseOut

sprite.alpha = 0

sprite.runAction(

SKAction.sequence([

SKAction.waitForDuration(delay),

SKAction.group([

SKAction.fadeInWithDuration(0.05),

moveAction,

addCookieSound])

]))

}

}

/

runAction(SKAction.waitForDuration(longestDuration), completion: completion)

}

func animateGameOver(completion: () -> ()) {

let action = SKAction.moveBy(CGVector(dx: 0, dy: -size.height), duration: 0.3)

action.timingMode = .EaseIn

gameLayer.runAction(action, completion: completion)

}

func animateBeginGame2(completion: () -> ()) {

gameLayer.hidden = false

gameLayer.position = CGPoint(x: 0, y: size.height)

let action = SKAction.moveBy(CGVector(dx: 0, dy: -size.height), duration: 0.3)

action.timingMode = .EaseOut

gameLayer.runAction(action, completion: completion)

}

/

func showSelectionIndicatorForCookie(cookie: Cookie) {

/

if selectionSprite.parent != nil {

selectionSprite.removeFromParent()

}

/

/

/

if let sprite = cookie.sprite {

let texture = SKTexture(imageNamed: cookie.cookieType.highlightedSpriteName)

selectionSprite.size = texture.size()

selectionSprite.runAction(SKAction.setTexture(texture))

sprite.addChild(selectionSprite)

selectionSprite.alpha = 1.0

}

}

func hideSelectionIndicator() {

selectionSprite.runAction(SKAction.sequence([

SKAction.fadeOutWithDuration(0.3),

SKAction.removeFromParent()]))

}

}

Answered by QuinceyMorris in 141327022

You're not going to get a helpful answer because you posted too much code (people won't bother to wade through it), and because you don't show evidence of having tried to at least narrow down the problem (people won't write your app for you).


>> the error is "if let cookie2 = level!.cookieAtColumn2(column, row: row){" Stating EXC_BAD_INSTRUCTION (code = EXC_I386_INVOP, subcode = 0x0)


The "bad instruction" error in Swift apps often just means that your app is being forced to crash. This can happen, for example, when you force-uwrap an optional variable that's nil. In this case, therefore, I'd start looking at whether the "level" variable might be nil.

Accepted Answer

You're not going to get a helpful answer because you posted too much code (people won't bother to wade through it), and because you don't show evidence of having tried to at least narrow down the problem (people won't write your app for you).


>> the error is "if let cookie2 = level!.cookieAtColumn2(column, row: row){" Stating EXC_BAD_INSTRUCTION (code = EXC_I386_INVOP, subcode = 0x0)


The "bad instruction" error in Swift apps often just means that your app is being forced to crash. This can happen, for example, when you force-uwrap an optional variable that's nil. In this case, therefore, I'd start looking at whether the "level" variable might be nil.

sorry thanks for the advice very useful man. Your great didnt know what the appropriate amt of code to show to geniuses would be!

Error. Please help if ya can:!
 
 
Q