2016-10-20 7 views
0

Я хочу сделать коробки, и когда вы нажмете на ящики с пулей, коробка, в которую вы попали, исчезнет.Spritekit - завершение с неперехваченным исключением типа NSException

Я могу заставить его работать, создав единую ячейку в функции. Но когда Im создает функцию с циклом для создания нескольких ящиков, приложение будет разбиваться. Когда я делаю переменную SpriteKitNode внутри функции, поля будут отображаться правильно, но не исчезнут, когда вы нажмете их на пулю. Теперь я создаю переменную вне функции, и приложение будет сбой при запуске проекта.

import SpriteKit 

struct PhysicsCategory { 
static let Enemy : UInt32 = 1 
static let Bullet : UInt32 = 2 
} 

class GameScene: SKScene, SKPhysicsContactDelegate { 

var mainAnimation = SKSpriteNode(imageNamed: "Spaceship") 
var squareAnimation = SKSpriteNode(imageNamed: "Squares") 

override func didMove(to view: SKView) { 

    physicsWorld.contactDelegate = self 

    makeBanners() 
    spaceshipPosition() 
    makeSquares(numberOfSquaresInRow: 5, numberOfRows: 4, squareRadius: 5, rowSpacing: 40, yStart: 120) 
} 

И функция, где я предполагаю, что ошибка является

func makeSquares (numberOfSquaresInRow: Int, numberOfRows: Int, squareRadius: CGFloat, rowSpacing: CGFloat, yStart: CGFloat) { 

    for rowNumber in 0...(numberOfRows - 1) { 
     let squareSpacing = (self.frame.size.width - (CGFloat(numberOfSquaresInRow) * squareRadius * 2))/CGFloat(numberOfSquaresInRow + 1) 

     var extraSpacing = CGFloat(0) 
     if rowNumber % 2 == 1 { 
      extraSpacing = squareSpacing/2 
     } 

     for squareNumber in 0...(numberOfSquaresInRow - 1) { 

      squareAnimation.size = CGSize(width: 30, height: 30) 

      let xPosition : CGFloat = extraSpacing + squareSpacing + squareRadius + (squareRadius * 2 * CGFloat(squareNumber)) + (squareSpacing * CGFloat(squareNumber)) 

      let yPosition : CGFloat = yStart + (CGFloat(rowNumber) * squareSpacing) 

      squareAnimation.position = CGPoint(x: xPosition, y: yPosition) 

      squareAnimation.physicsBody = SKPhysicsBody(circleOfRadius: squareRadius) 

      squareAnimation.physicsBody?.categoryBitMask = PhysicsCategory.Enemy 
      squareAnimation.physicsBody?.contactTestBitMask = PhysicsCategory.Bullet 

      squareAnimation.physicsBody?.affectedByGravity = false 
      squareAnimation.physicsBody?.isDynamic = false 

      self.addChild(squareAnimation) 
     } 
    } 
} 

Конечно, это не все коды. Дайте мне знать, если вам нужно больше.

ответ

1

Обычно, когда вы встречаете ошибку типа:

Terminating app due to uncaught exception 'NSInvalidArgumentException' за ним следует: причине .. так что вы сможете понять, что случилось с вашим проектом, но здесь я думаю, что проблема в том, что вы добавите слишком много раз тот же узел с:

self.addChild(squareAnimation) 

поэтому компилятор идти к краху, потому что вы только что добавили данный узел в первый раз в цикле.

Для решения вы можете добавить строку немедленно после того, как для цикла сказать компилятор «Эй, я уже новое свойство, это моя инициализация и это происходит в течение каждого цикла»:

let squareAnim = SKSpriteNode(imageNamed: "Squares") 

и работайте с остальными строками с квадратомAnim

+0

Когда я положил self.addChild (squareAnimation) сразу после цикла for, будет 4 поля. Лучше - но должно быть 12 – jonask

+0

. Вы должны реорганизовать свой код, чтобы получить больше полей. –

+0

@jonask. Вы не должны были перемещать addChild вне цикла for, вы предполагали создать новый квадрат спрайта в качестве первой строки для петля. Кажется, сейчас squareAnimation является глобальным, это очень опасно, как вы можете видеть по вашим ошибкам. – Knight0fDragon

Смежные вопросы