2016-10-20 3 views
0

상자를 만들고 싶습니다. 상자에 맞으면 상자가 나오고 사라집니다.Spritekit - NSException 유형의 캐치되지 않는 예외로 종료합니다.

함수에서 하나의 상자를 만들어서 만들 수 있습니다. 하지만 for 루프로 여러 상자를 만드는 함수를 만들면 앱이 다운됩니다. 함수 내에서 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) 

그래서 컴파일러는 그냥이 노드를주기에 처음으로 추가했기 때문에 충돌로 이동합니다.

사이클에 대한이 컴파일러 말을 immediatly 후 라인을 추가 할 수 있습니다 해결하기 위해 "이봐, 난이 내 초기화 새로운 속성입니다했고이 각 사이클 일"

let squareAnim = SKSpriteNode(imageNamed: "Squares") 

및 squareAnim을 사용하여 나머지 라인들과 작업하십시오.

+0

for 루프 바로 뒤에 self.addChild (squareAnimation)를 넣으면 4 개의 박스가 생깁니다. 더 나은 -하지만 있어야합니다 12 – jonask

+0

더 많은 상자를 얻으려면 코드를 리팩토링해야합니다 –

+0

@jonask for 루프 외부에서 addChild를 이동한다고 가정하지 않았 으면 새 정사각형 스프라이트를 첫 행으로 사용한다고 가정했습니다. 고리. 바로 지금 squareAnimation이 글로벌 인 것처럼 보입니다. 이것은 오류로 볼 수있는 것처럼 매우 위험합니다. – Knight0fDragon

관련 문제