2016-07-14 4 views
0

Bevor Sie als Duplikat markieren, beachten Sie bitte, dass ich das Web und StackOverflow durchsucht habe, aber keine Lösung für dieses spezielle Problem gefunden habe Alle Fragen zu diesem Fehler beziehen sich auf Apps und nicht auf Spiele.xcode: Thread 1: Signal SIGABART in Klasse AppDelegate: UIResponder, UIApplicationDelegate (Spielanwendung)

Ich mache ein sehr einfaches Spiel Space Shooter und ich erreichte eine Bühne, wo ich möchte den Helden (Code unten) schießen Kugeln; Ich habe dazu eine Funktion spawn_bullet erstellt. Nachdem ich diese Funktion geschrieben und in der Funktion aufgerufen:

Überschreibung func Update (current: CFTimeInterval),

ich den Fehler: Thread 1: Signal SIGABRT. Bild ist unter

enter image description here Ich glaube, dass der Fehler etwas mit der Ausführung der spawn_bullet Funktion zu tun hat, aber ich bin nicht sicher, wo es ist, warum es verursacht und wie es zu beheben. Jeder hat eine Idee, um es zu beheben und wenn möglich, um genügend Details zu liefern, warum es verursacht?

Vielen Dank!

HINWEIS Englisch ist nicht meine erste Sprache (das ist, warum es schlecht ist)

Im Folgenden werde ich meinen Code in GameScene.swift verwendet bieten:

import SpriteKit 

class GameScene: SKScene { 

    var hero = SKSpriteNode(imageNamed: "hero") 
    var bullet = SKSpriteNode(imageNamed: "bullet") 
    var enemy = SKSpriteNode(imageNamed: "enemy") 
    var init_bullet_position = CGFloat(0) 
    var bullet_velocityY = CGFloat(5) 

    override func didMoveToView(view: SKView) { 
     /* Setup your scene here */ 
     self.backgroundColor = UIColor(red: 0.7, green: 0.7, blue: 0.8, alpha: 1) 

     self.hero.anchorPoint = CGPointMake(0.5, 0) 
     self.hero.size.height = 50 
     self.hero.size.width = 30 
     self.hero.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMinX(self.frame) + self.hero.size.height) 

     self.bullet.anchorPoint = CGPointMake(0.5, 0) 
     self.bullet.size.height = 30 
     self.bullet.size.width = 15 
     self.bullet.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMinX(self.frame) + self.hero.size.height + self.hero.size.height/4) 

     self.init_bullet_position = CGFloat(CGRectGetMinX(self.frame) + self.hero.size.height + self.hero.size.height/4) 

     self.hero.zPosition = 1; //1 = front 
     self.addChild(bullet) 
     self.addChild(hero) 
    } 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     /* Called when a touch begins */ 
     for touch: AnyObject in touches { 
      let location = touch.locationInNode!(self) 
      hero.position.x = location.x 
      if self.bullet.position.y == init_bullet_position{ 
       self.bullet.position.x = location.x 
      } 
     } 
    } 

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     /* Called when a touch begins */ 
     for touch: AnyObject in touches { 
      let location = touch.locationInNode!(self) 
      self.hero.position.x = location.x 
      if self.bullet.position.y == init_bullet_position{ 
       self.bullet.position.x = location.x 
      } 
     } 
    } 

    func spawn_bullets(){ 
     self.bullet.anchorPoint = CGPointMake(0.5, 0) 
     self.bullet.size.height = 30 
     self.bullet.size.width = 15 
     self.bullet.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMinX(self.frame) + self.hero.size.height + self.hero.size.height/4) 
     self.addChild(bullet) 

     if self.bullet.position.y < self.frame.size.height{ 
      self.bullet.position.y += self.bullet_velocityY 
     } 
    } 

    override func update(currentTime: CFTimeInterval) { 
     /* Called before each frame is rendered */ 
     spawn_bullets() 
    } 
} 

Hier ist die Ausnahmemeldung:

2016-07-14 23:07:54.564 Space shooter[14391:191912] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attemped to add a SKNode which already has a parent: <SKSpriteNode> name:'(null)' texture:[<SKTexture> 'bullet' (400 x 600)] position:{160, 62.5} scale:{1.00, 1.00} size:{15, 30} anchor:{0.5, 0} rotation:0.00' 
*** First throw call stack: 
(
    0 CoreFoundation      0x000000010ec4fd85 __exceptionPreprocess + 165 
    1 libobjc.A.dylib      0x0000000111299deb objc_exception_throw + 48 
    2 CoreFoundation      0x000000010ec4fcbd +[NSException raise:format:] + 205 
    3 SpriteKit       0x000000010fb74903 -[SKNode insertChild:atIndex:] + 162 
    4 SpriteKit       0x000000010fb74840 -[SKNode addChild:] + 68 
    5 Space shooter      0x000000010ea62d23 _TFC13Space_shooter9GameScene13spawn_bulletsfT_T_ + 995 
    6 Space shooter      0x000000010ea62ef4 _TFC13Space_shooter9GameScene6updatefSdT_ + 36 
    7 Space shooter      0x000000010ea62f2c _TToFC13Space_shooter9GameScene6updatefSdT_ + 44 
    8 SpriteKit       0x000000010fb48072 -[SKScene _update:] + 312 
    9 SpriteKit       0x000000010fb6503a -[SKView _update:] + 932 
    10 SpriteKit       0x000000010fb6221a __59-[SKView _renderSynchronouslyForTime:preRender:postRender:]_block_invoke + 170 
    11 SpriteKit       0x000000010fb620e8 -[SKView _renderSynchronouslyForTime:preRender:postRender:] + 235 
    12 SpriteKit       0x000000010fb64ac2 -[SKView layoutSubviews] + 85 
    13 UIKit        0x000000010fdd8980 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 703 
    14 QuartzCore       0x00000001151d7c00 -[CALayer layoutSublayers] + 146 
    15 QuartzCore       0x00000001151cc08e _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 366 
    16 QuartzCore       0x00000001151cbf0c _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24 
    17 QuartzCore       0x00000001151c03c9 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 277 
    18 QuartzCore       0x00000001151ee086 _ZN2CA11Transaction6commitEv + 486 
    19 QuartzCore       0x00000001151ee7f8 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 92 
    20 CoreFoundation      0x000000010eb74c37 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23 
    21 CoreFoundation      0x000000010eb74ba7 __CFRunLoopDoObservers + 391 
    22 CoreFoundation      0x000000010eb6a11c CFRunLoopRunSpecific + 524 
    23 UIKit        0x000000010fd18f21 -[UIApplication _run] + 402 
    24 UIKit        0x000000010fd1df09 UIApplicationMain + 171 
    25 Space shooter      0x000000010ea64e82 main + 114 
    26 libdyld.dylib      0x0000000111dc792d start + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
+1

Bearbeiten Sie Ihre Frage und die Stack-Trace + Ausnahmemeldung hinzufügen, die – dan

+0

auf der Konsole ausgegeben wurde auch der Code zeigen Bitte. –

+0

Sorry Jungs für die fehlenden Teile. Ich habe meine Frage erfolgreich aktualisiert. – GeorGios

Antwort

0

Um die angegebene Frage zu beantworten:

Hier ist Ihr Fehler:

Attemped to add a SKNode which already has a parent

Das Problem in Ihrer spawn_bullets() Funktion ist. In dieser Funktion werden keine neuen Kugeln instanziiert. Du aktualisierst nur Eigenschaften auf der Instanz von bullet von self und versuchst dann, sie als Kind deiner Szene hinzuzufügen. Wenn diese Funktion zum zweiten Mal aufgerufen wird, stürzt sie ab, weil das Geschoss bereits ein Kind der Szene ist.

Stattdessen sollten Sie neue Instanzen Ihres Aufzählungsknotens erstellen.

Im Hinblick auf das zugrunde liegende Problem der einzigartigen Kugeln zu schaffen:

Dies ist ein ganz anderes Thema an und für sich. Ich nehme an, dass Sie Kugeln nur zu bestimmten Zeiten abfeuern möchten, zum Beispiel wenn Sie auf etwas tippen. Anstatt Kugeln aus der Funktion update() zu erzeugen, die vor jedem Bild aufgerufen wird, würde ich spawn_bullets() aus einer Tap-Methode oder anderen aufrufen Interaktion. Zweitens möchten Sie neue Instanzen Ihres Aufzählungszeichens erstellen, anstatt eine Variable in Ihrer Szene zu aktualisieren. Diese können hinzugefügt, animiert und anschließend entfernt werden. Sehen Sie sich schließlich die Klasse SKAction an, um die Kugeln tatsächlich zu animieren (und letztendlich zu entfernen). Zum Beispiel:

let newBullet = SKSpriteNode(imageNamed: "bullet") 
newBullet.position = CGPoint(x: 10, y: 10) 
self.addChild(newBullet) 

let moveAction = SKAction.moveTo(CGPoint(x: 50, y: 10), duration: 0.4) 
let removeAction = SKAction.removeFromParent() 
newBullet.runAction(SKAction.sequence([moveAction, removeAction])) { 
    // Bullet is done and removed. 
} 

Sie können viel mehr tun mit SKAction als hier dargestellt ist. Sie können Audiodateien abspielen, Pfaden folgen oder einfach nur einen Block abspielen.

+0

Nun, ich versuche den Helden dazu zu bringen, Kugeln zu schießen. Gibt es eine Möglichkeit, dies zu tun? – GeorGios

+0

* (überrascht ...) * und das verursacht ein * Abbruch * Signal? Beeindruckend. (Wohlgemerkt, Dalton, ich bestreite dich nicht!) –

0

Es tritt auf dieser Linie:

self.addChild(bullet) 

Dies liegt daran, bullet bereits einen Elternteil hat.

es zu beheben, diese Zeile hinzufügen, bevor Sie das Kind hinzu:

bullet.removeFromParent() 
Verwandte Themen