2017-08-30 57 views
0

我已經搜索了我所有的代碼,並且仍然無法弄清爲什麼我收到我正在收到的錯誤。我也看過其他線程,並且在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%的發佈「爲什麼我的應用崩潰?」的人更好?問題。 –

回答

1

問題:您致電createWalls()didMove(to:)。您還可以撥打電話createWalls()touchesBegan(:with:)。你第一次打電話createWalls(),它添加一個節點到現場。第二次調用createWalls()時,它會嘗試再次將同一節點添加到場景中。你會得到一個異常,告訴你你試圖添加一個已經添加到場景中的節點。

解決方案:不要這樣做。 createWalls()顯然是一種只需要調用一次的設置方法,因此請確保只調用一次。

+0

工作!謝謝Charles。 –