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

标签 swift sprite-kit

我想做盒子,当你用子弹击中盒子时,你击中的盒子就会消失。

我可以通过在一个函数中制作一个盒子来让它工作。但是当我使用 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' 它后跟:reason.. 所以你能够理解你的项目发生了什么,但在这里我认为问题是您添加了太多次相同的节点:

self.addChild(squareAnimation)

所以编译器会崩溃,因为你刚刚在循环中第一次添加了这个节点。

要解决这个问题,您可以在 FOR 循环之后立即添加一行,告诉编译器“嘿,我有一个新属性,这是我的初始化,每个循环都会发生这种情况”:

let squareAnim = SKSpriteNode(imageNamed: "Squares")

并使用 squareAnim 处理其余的线条

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

相关文章:

swift 。我如何获得 node.children 的类型?

ios - SpriteKit : How can I get the pixel color from a point in SKSpriteNode?

ios - 如何在 Swift 中使用 GCDWebServer 读取 POST 请求的主体

ios - Firebase 云消息传递未收到通知 (iOS)

ios - 在构建我的 Cocoapod 时,有没有办法指定对另一个分支的依赖?

swift - webkit webview 中的 Google iframe 问题它工作正常

ios - 使用 sdk paypal 在 swift 3 中键入 NSDecimalNumber

Swift 音频播放速度

ios - SpriteKit : SKShapeNodes overlapping

ios - Swift SpriteKit - SKAction 中的 zRotation 跟随路径