私は、spritekitでシューティングゲームを作っていて、敵の処理をなどを関数に分けて書いているのですが、関数内にSKSpriteNodeでNodeを作ってしまうと、didBeginで衝突判定ができませんでした。そのためNodeを入れる配列を用意しNodeを宣言した後に配列にいれたのですが、didBeginで参照することができません。どのようにすれば、衝突をしたときにNodeを消せるのか教えていただきたいです。
配列の宣言
class GameScene: SKScene, SKPhysicsContactDelegate{ struct PhysicsCategoryStruct{ let playerCategory:UInt32 = 0b0001 //1 let shotCategory:UInt32 = 0b0010 //2 let monsterCategory:UInt32 = 0b0100 //4 } //宣言 let w = UIScreen.main.bounds.size.width let h = UIScreen.main.bounds.size.height //ノードを入れる配列を用意 var allEnemies:[SKNode] = [] var allShot:[SKNode] = []
モンスター1の処理
@objc func monster1(){ if count >= 0 && count <= 10{ //monster1作成 let monster1Node = SKSpriteNode(imageNamed: "敵1.png") //ここでallEnemiesに追加 allEnemies.append(monster1Node) 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.monsterCategory 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 } }
衝突したとき
func didBegin(_ contact: SKPhysicsContact) { var firstBody:SKPhysicsBody var secondBody:SKPhysicsBody if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask{ //shot(player)とモンスター firstBody = contact.bodyA secondBody = contact.bodyB }else{ firstBody = contact.bodyB secondBody = contact.bodyA } switch (firstBody == contact.bodyA) && (secondBody == contact.bodyB) { case (firstBody.categoryBitMask & PhysicsCategory.shotCategory != 0) && (secondBody.categoryBitMask & PhysicsCategory.monsterCategory != 0): print("first弾 -> secondモンスター") //ここに書こうと思ってました。 case (firstBody.categoryBitMask & PhysicsCategory.playerCategory != 0) && (secondBody.categoryBitMask & PhysicsCategory.monsterCategory != 0): print("first自機 -> secondモンスター") default: break } switch (firstBody == contact.bodyB) && (secondBody == contact.bodyA) { case (firstBody.categoryBitMask & PhysicsCategory.monsterCategory != 0) && (secondBody.categoryBitMask & PhysicsCategory.shotCategory != 0): print("firstモンスター -> second弾") case (firstBody.categoryBitMask & PhysicsCategory.monsterCategory != 0) && (secondBody.categoryBitMask & PhysicsCategory.playerCategory != 0): print("firstモンスター -> second自機") default: break } }
indexOfをつかってインデックスを出そうと思っても、「タイプ '[SKNode]'の値に 'indexOf'というメンバがありません」とでてしまいます。基礎的なところですが、よろしくお願いします!
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。