Swift 3,iOS 10 - 错误:线程1信号Sigabrt(SPRITEKIT)

问题描述:

我已经搜索了我所有的代码,并且仍然无法弄清为什么我收到我正在收到的错误。我也看过其他线程,并且在spritekit上找不到更新的东西,于是我转而问自己的问题。 Xcode是告诉我它是一个线程1:信号SIGABRT对我的 “类的AppDelegate:UIResponder,UIApplicationDelegate” 在AppDelegate中的错误:Swift 3,iOS 10 - 错误:线程1信号Sigabrt(SPRITEKIT)

2017-08-29 23:26:57.775 Flappy Land[10451:1252264] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attemped to add a SKNode which already has a parent: <SKSpriteNode> name:'(null)' texture:[<SKTexture> 'Wall' (100 x 1000)] position:{20, -600} scale:{1.00, 1.00} size:{100, 1000} anchor:{0.5, 0.5} rotation:0.00' 
*** First throw call stack: 
(
    0 CoreFoundation      0x000000010d2fcb0b __exceptionPreprocess + 171 
    1 libobjc.A.dylib      0x0000000109c3e141 objc_exception_throw + 48 
    2 CoreFoundation      0x000000010d365625 +[NSException raise:format:] + 197 
    3 SpriteKit       0x000000010a904c95 -[SKNode insertChild:atIndex:] + 162 
    4 SpriteKit       0x000000010a904bd2 -[SKNode addChild:] + 68 
    5 Flappy Land       0x000000010965bf02 _TFC11Flappy_Land9GameScene11createWallsfT_T_ + 2018 
    6 Flappy Land       0x000000010965ccd3 _TFFC11Flappy_Land9GameScene12touchesBeganFTGVs3SetCSo7UITouch_4withGSqCSo7UIEvent__T_U_FT_T_ + 35 
    7 Flappy Land       0x000000010965cdb7 _TTRXFo___XFdCb___ + 39 
    8 SpriteKit       0x000000010a8f2f1f -[SKRunBlock updateWithTarget:forTime:] + 99 
    9 SpriteKit       0x000000010a8c4ae5 _ZN11SKCSequence27cpp_updateWithTargetForTimeEP7SKCNoded + 99 
    10 SpriteKit       0x000000010a8b280b _ZN9SKCRepeat27cpp_updateWithTargetForTimeEP7SKCNoded + 45 
    11 SpriteKit       0x000000010a8baace _ZN7SKCNode6updateEdf + 250 
    12 SpriteKit       0x000000010a8d0d95 -[SKScene _update:] + 628 
    13 SpriteKit       0x000000010a8eeb8f -[SKView _update:] + 984 
    14 SpriteKit       0x000000010a8eb5ed __51-[SKView _vsyncRenderForTime:preRender:postRender:]_block_invoke.322 + 285 
    15 SpriteKit       0x000000010a8eaa16 -[SKView _vsyncRenderForTime:preRender:postRender:] + 580 
    16 SpriteKit       0x000000010a8ec1f9 __29-[SKView setUpRenderCallback]_block_invoke + 211 
    17 SpriteKit       0x000000010a922ae4 -[SKDisplayLink _callbackForNextFrame:] + 335 
    18 QuartzCore       0x0000000111128767 _ZN2CA7Display15DisplayLinkItem8dispatchEy + 51 
    19 QuartzCore       0x000000011112862d _ZN2CA7Display11DisplayLink14dispatch_itemsEyyy + 439 
    20 CoreFoundation      0x000000010d28fb61 __CFMachPortPerform + 161 
    21 CoreFoundation      0x000000010d28faa9 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 41 
    22 CoreFoundation      0x000000010d28fa21 __CFRunLoopDoSource1 + 465 
    23 CoreFoundation      0x000000010d287ba0 __CFRunLoopRun + 2352 
    24 CoreFoundation      0x000000010d287016 CFRunLoopRunSpecific + 406 
    25 GraphicsServices     0x0000000111759a24 GSEventRunModal + 62 
    26 UIKit        0x000000010aaee0d4 UIApplicationMain + 159 
    27 Flappy Land       0x000000010965f0d7 main + 55 
    28 libdyld.dylib      0x000000010e29c65d start + 1 
    29 ???         0x0000000000000001 0x0 + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
(lldb) 

我的代码:

import SpriteKit 
import GameplayKit 

struct PhysicsCategory { 

static let Ghost : UInt32 = 0x1 << 1 
static let Ground : UInt32 = 0x1 << 2 
static let Wall : UInt32 = 0x1 << 3 

} 

class GameScene: SKScene { 

//Variables - Global 
var Ground = SKSpriteNode() 
var Ghost = SKSpriteNode() 
var Wall = SKSpriteNode() 
let btmWall = SKSpriteNode(imageNamed: "Wall") 
var gameStarted = Bool() 


var moveAndRemove = SKAction() 

override func didMove(to view: SKView) { 

    //Ground Stuff 
    Ground = SKSpriteNode(imageNamed: "Ground") 
    Ground.setScale(1) 
    Ground.position = CGPoint(x: 0 , y: -640) 

    Ground.physicsBody = SKPhysicsBody(rectangleOf : Ground.size) 
    Ground.physicsBody?.categoryBitMask = PhysicsCategory.Ground 
    Ground.physicsBody?.collisionBitMask = PhysicsCategory.Ghost 
    Ground.physicsBody?.contactTestBitMask = PhysicsCategory.Ghost 
    Ground.physicsBody?.affectedByGravity = false 
    Ground.physicsBody?.isDynamic = false 

    self.addChild(Ground) 

    //Ghost Stuff 
    Ghost = SKSpriteNode(imageNamed: "Ghost") 
    Ghost.size = CGSize(width: 60, height: 70) 
    Ghost.position = CGPoint(x: -200, y: 0.0) 
    Ghost.setScale(2.0) 

    Ghost.physicsBody = SKPhysicsBody(circleOfRadius: Ghost.frame.height/2) 
    Ghost.physicsBody?.categoryBitMask = PhysicsCategory.Ghost 
    Ghost.physicsBody?.collisionBitMask = PhysicsCategory.Ground | PhysicsCategory.Wall 
    Ghost.physicsBody?.contactTestBitMask = PhysicsCategory.Ground | PhysicsCategory.Wall 
    Ghost.physicsBody?.affectedByGravity = true 
    Ghost.physicsBody?.isDynamic = true 


    self.addChild(Ghost) 


    createWalls() 

     } 

func createWalls() { 



    btmWall.setScale(1) 
    btmWall.position = CGPoint(x: 20, y: -600) 


    btmWall.physicsBody = SKPhysicsBody(rectangleOf: btmWall.size) 
    btmWall.physicsBody?.categoryBitMask = PhysicsCategory.Wall 
    btmWall.physicsBody?.collisionBitMask = PhysicsCategory.Ghost 
    btmWall.physicsBody?.contactTestBitMask = PhysicsCategory.Wall 
    btmWall.physicsBody?.isDynamic = false 
    btmWall.physicsBody?.affectedByGravity = false 

    btmWall.run(moveAndRemove) 

    addChild(btmWall) 

} 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 

    if gameStarted == false { 

     gameStarted = true 

     let spawn = SKAction.run({ 
      () in 

      self.createWalls() 
     }) 

     let delay = SKAction.wait(forDuration: 2.0) 
     let spawnDelay = SKAction.sequence([spawn , delay]) 
     let spawnDelayForever = SKAction.repeatForever(spawnDelay) 

     self.run(spawnDelayForever) 

     let distance = CGFloat(self.frame.width + btmWall.frame.width) 
     let movePipes = SKAction.moveBy(x: -distance, y: 0, duration: TimeInterval(0.01 * distance)) 
     let removePipes = SKAction.removeFromParent() 
     moveAndRemove = SKAction.sequence([movePipes , removePipes]) 

     Ghost.physicsBody?.velocity = CGVector(dx: 0, dy: 0) 
     Ghost.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 500)) 


    } else { 


     Ghost.physicsBody?.velocity = CGVector(dx: 0, dy: 0) 
     Ghost.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 500)) 



    } 


} 

} 

任何帮助mucha赞赏。谢谢!

+2

从哪里可以找到Xcode 10? – technerd

+1

要求陌生人找出为什么应用程序崩溃而未指定崩溃的实际行不是一个好主题。 –

+0

他/她发布了显示崩溃位置的堆栈跟踪。这比99.99%的发布“为什么我的应用崩溃?”的人更好?问题。 –

问题:您致电createWalls()didMove(to:)。您还可以拨打电话createWalls()touchesBegan(:with:)。你第一次打电话createWalls(),它添加一个节点到现场。第二次调用createWalls()时,它会尝试再次将同一节点添加到场景中。你会得到一个异常,告诉你你试图添加一个已经添加到场景中的节点。

解决方案:不要这样做。 createWalls()显然是一种只需要调用一次的设置方法,因此请确保只调用一次。

+0

工作!谢谢Charles。 –