私はspritekitでシューティングゲームを作っているのですが、敵キャラのSKSpriteNodeの位置が、関数内だとうまく動いてくれるのですがそれだと当たり判定のdidBeginでつかえないので、GameSceneのすぐ下で書こうと思ったのですが、それだと弾が画面外に出た瞬間に強制終了してしまいます。
コードclass GameScene: SKScene, SKPhysicsContactDelegate { struct PhysicsCategoryStruct{ let playerCategory:UInt32 = 0b0001 //1 let shotCategory:UInt32 = 0b0010 //2 let monster1Category:UInt32 = 0b0100 //4 let monster2Category:UInt32 = 0b1000 //8 } //ここだと強制終了してしまいます... let monster1Node = SKSpriteNode(imageNamed: "敵1.png")
コード//モンスター1 0-10 @objc func monster1(){ if count >= 0 && count <= 10{ //monster1作成 //ここだと大丈夫でした... let monster1Node = SKSpriteNode(imageNamed: "敵1.png") monster1Node.size = CGSize(width: 50.0, height: 50.0) monster1Node.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "敵1.png"), size: monster1Node.size) monster1Node.physicsBody?.isDynamic = true monster1Node.physicsBody?.categoryBitMask = PhysicsCategory.monster1Category monster1Node.physicsBody?.contactTestBitMask = PhysicsCategory.playerCategory monster1Node.physicsBody?.contactTestBitMask = PhysicsCategory.shotCategory //enemy出現の設定 let minValue = w / 8 let maxValue = w - 30 let spanPoint = UInt32(maxValue - minValue) randomMonster(enemy: monster1Node, spanPoint: spanPoint) addChild(monster1Node) if count == 10{ print("モンスター1終了") monsterTimer.invalidate() } count += 1 } }
自分ではどうすればよいか思いつきませんでした...。
どうかよろしくお願いします。
強制終了時、Consoleに表示されるエラーメッセージを書いて下さい。
ちなみに monster1()内の let monster1Node = ... の行はコメントアウトしていますか?
AppDelegateにとんで「Thread 1: signal SIGABRT」とかかれ、(11db)とコンソールに書かれてしまいます。
あと、コメントアウトの行はサイトに貼ってから書いたので大丈夫です。
「Consoleに表示されるエラーメッセージを書いて下さい」
(11db)です。
(lldb) はプロンプトです。(なお 11db ではなく lldb です)
その上に表示されているエラーメッセージを書いて下さい。
libc ++ abi.dylib:NSException型のキャッチされていない例外で終了する
と、
未知の例外 'NSInvalidArgumentException'のためアプリを終了します、理由: '既に親を持つSKNodeを追加しようとしました:<SKSpriteNode>
です。遅れてしまってすいません...
回答1件
あなたの回答
tips
プレビュー