以NSException类型的未捕获异常终止

以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)
        }
    }
}

当然,这并不是所有的代码。如果你需要更多,请告诉我。

最佳答案

通常,当您遇到如下错误时:
Terminating app due to uncaught exception 'NSInvalidArgumentException'后面跟着:原因。。所以你可以理解你的项目发生了什么,但我认为问题是你在同一个节点上添加了太多次:

self.addChild(squareAnimation)

所以编译器会崩溃,因为您刚刚在循环中第一次添加了这个节点。
要解决这个问题,可以在FOR循环之后立即添加一行代码,对编译器说“嘿,我有一个新属性,这是我的初始化,每个循环都会发生这种情况”:
let squareAnim = SKSpriteNode(imageNamed: "Squares")

用squareAnim处理其余的线条

关于swift - Spritekit-以NSException类型的未捕获异常终止,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40149271/

10-10 10:36