2016-07-14 1 views
0

重複としてマークする前に、私はWebとStackOverflowを検索しましたが、この特定の問題の解決策は見つかりませんでした。このエラーに関するすべての質問は、ゲームではなくアプリに対するものです)。xcode:スレッド1:信号AppBelegateのSIGABART:UIResponder、UIApplicationDelegate(ゲームアプリケーション)

私は非常に基本的な宇宙飛行士のゲームを作っており、私は主人公(下のコード)が弾丸を撃つようにしたい段階に達しました。私はこれを行うために関数spawn_bulletを作成しました。私は、この関数を書き、関数内でそれを呼び出した後:

オーバーライドFUNC更新スレッド1:信号SIGABRT(CURRENTTIME:CFTimeInterval)、

私はエラーを取得します。画像は、私はエラーがspawn_bullet関数の実行とは何かを持っていると信じている

enter image description here の下に示されているが、それが発生し、それを修正する方法を、なぜそれが、ここで私はわかりません。誰でもそれを修正し、できるだけそれが原因で十分な詳細を提供できると考えていますか?

ありがとうございました! 英語は私の最初の言語ではありません

NOTE(それが悪い理由です)

私はGameScene.swiftで使用される私のコード提供の下には:ここで

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

を例外メッセージです:

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

を編集ご質問や、あなたのコードを表示してくださいコンソール – dan

+0

に印刷されてしまったスタックトレース+例外メッセージを追加:あなたは子供を追加する前にそれを修正する

は、この行を追加します。 –

+0

紛失した部品にはごめんなさい。私は正常に私の質問を更新しました。 – GeorGios

答えて

0

はここにあなたのエラーです:

Attemped to add a SKNode which already has a parent

問題は、あなたのspawn_bullets()機能です。あなたは実際にこの関数で新しい箇条書きをインスタンス化していません。自己の弾丸のインスタンスのプロパティを更新してから、シーンの子として追加しようとしているだけです。 2回目にこの関数が呼び出されると、弾丸はすでにシーンの子であるため、クラッシュします。

代わりに、箇条書きノードの新しいインスタンスを作成する必要があります。ユニークな弾丸を作成する根本的な問題について

これは、それ自体の全体の別のトピックです。私はあなたが何かをタップするなどの特定の時に弾丸を発射したいと思うと仮定します。update()関数からの弾丸を生成するのではなく、各フレームがレンダリングされる前に呼び出されます。spawn_bullets()をタップメソッド、インタラクション。第二に、シーンの変数を更新する代わりに、弾丸の新しいインスタンスを作成することが必要になります。これらは、追加、アニメーション化、およびその後の削除が可能です。最後に、実際にアニメーション化(そして最終的には削除)するためのSKActionクラスを見てください。たとえば、

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. 
} 

では、ここに示すよりも多くのことができます。オーディオファイルを再生したり、パスをたどったり、ブロックを実行したりすることもできます。

+0

まあ、私は英雄が弾丸を撃つようにしようとしています。これを行う方法はありますか? – GeorGios

+0

*(驚いたことに...)*これは*アボート*信号を引き起こしますか?ワオ。 (あなた、ダルトン、私は**あなたに異議を唱えていない!) –

0

それは、この行で発生しますbulletはすでに親を持っているので

self.addChild(bullet) 

です。

bullet.removeFromParent() 
関連する問題