質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
SpriteKit

SpriteKitは、iOSやOS Xで使用できるApple社製の2Dゲーム開発フレームワークです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1457閲覧

Swiftの配列の参照について

panda_man

総合スコア20

SpriteKit

SpriteKitは、iOSやOS Xで使用できるApple社製の2Dゲーム開発フレームワークです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/12/18 20:39

私は、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'というメンバがありません」とでてしまいます。基礎的なところですが、よろしくお願いします!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

配列にこだわらずに、contact.bodyA.node.nameとcontact.bodyB.node.nameを使えば、解決できました。おさわがせしてすいません...

投稿2018/12/19 00:18

panda_man

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問