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()]))
}
}
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.