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

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

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

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

Swift

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

Q&A

0回答

507閲覧

Swift SpriteKit Node接触によるNodeの対消滅

sho.osada

総合スコア0

SpriteKit

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

Swift

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

0グッド

0クリップ

投稿2020/05/04 17:53

前提・実現したいこと

SwiftのSpriteKitで2Dのゲームを制作しています。
Node接触時(didBegin)の動作が上手くいきません。

発生している問題・エラーメッセージ__イタリックテキスト__

missile(Node)がasteroid(Node)に1度接触すると2度目からmissile(Node)が出現されなくなる。

エラーメッセージ
エラーは表示されない。

該当のソースコード

//button(Node)をタッチした際にmissile(Node)を出現させています。
//このコードは特に問題なく作動します。
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if isPaused { return }

self.missile.physicsBody = SKPhysicsBody(circleOfRadius: self.missile.frame.height / 2 ) //?????????????? self.missile.physicsBody?.categoryBitMask = missileCategory self.missile.physicsBody?.collisionBitMask = spaceshipCategory | missileCategory | asteroidCategory self.missile.physicsBody?.contactTestBitMask = asteroidCategory if let touch = touches.first { let locatin = touch.location(in: self) if self.atPoint(locatin).name == "button" { missile.position = CGPoint(x: self.spaceship.position.x , y: self.spaceship.position.y + 10 ) missile.size = CGSize(width: 75, height: 75) addChild(missile) let topButton = SKAction.moveTo(y: frame.width / 2 - self.spaceship.position.y , duration: 0.2) let remove = SKAction.removeFromParent() missile.run(SKAction.sequence([topButton, remove])) } }

//missile(Node)とasteroid(Node)の接触時にmissile(Node)とasteroid(Node)を消滅させたいのです。
//1度目の発射は問題ないのですが、1度発射と消滅を行うとmissile(Node)の発射が行われなくなります。
func didBegin(_ contact: SKPhysicsContact) {

var asteroid: SKPhysicsBody var target: SKPhysicsBody if contact.bodyA.categoryBitMask == asteroidCategory { asteroid = contact.bodyA target = contact.bodyB } else { asteroid = contact.bodyB target = contact.bodyA } guard let asteroidNode = asteroid.node else { return } guard let tagetNode = target.node else { return } guard let Bakuhatu = SKEmitterNode(fileNamed: "Bakuhatu") else { return } Bakuhatu.position = asteroidNode.position addChild(Bakuhatu) //ここに原因があるかと思います。。 asteroidNode.removeFromParent() if target.categoryBitMask == missileCategory { tagetNode.removeFromParent() } self.run(SKAction.wait(forDuration: 1.0)) { Bakuhatu.removeFromParent() } }
Swift

試したこと

なぜこのような状態になってしまっているのか訳がわかっていない状況で、何もできていないです。。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

fugu

2020/05/23 18:22

私も初心者なので説明は出来ませんが、 衝突の所の書き方が こんな感じじゃなかったでしょうか? func didBegin(_ contact:SKPhysicsContact){ var asteroid, target: SKPhysicsBody if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { asteroid = contact.bodyA target = contact.bodyB } else { asteroid = contact.bodyB target = contact.bodyA } if asteroid.categoryBitMask & asteroidCategory != 0 && target.categoryBitMask & missileCategory != 0 { target.node?.removeFromParent() } }
sho.osada

2020/05/24 10:50

@fuguさん ご回答ありがとうございます。 早速試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問