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

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

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

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Swift

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

Q&A

解決済

1回答

729閲覧

SpriteKieの衝突判定が反応しない

Hkr-Y

総合スコア96

SpriteKit

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Swift

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

0グッド

0クリップ

投稿2021/12/27 11:21

したいこと

制作するnodeの設定を別のclassに譲渡してコードの可読性を高めたい。

できないこと

別のclassでnodeの設定を行うと、正しく設定が適応されない。
その結果、衝突判定が発生しない。

別のclassに譲渡してないとき

(コード簡略化のため一部コードを省略してます)
下記のコードの時youtargetは衝突します。

swift

1class MainGameScene: SKScene, SKPhysicsContactDelegate { 2 3 var you: SKSpriteNode! 4 var target: SKSpriteNode! 5 6 let youCategoryMask: UInt32 = 0b0001 7 let targetCategoryMask: UInt32 = 0b0010 8 9 override func didMove(to view: SKView) { 10 self.physicsWorld.contactDelegate = self 11 12 you = SKSpriteNode(imageNamed: "you") 13 you.scale(to: CGSize(width: 100, height: 100)) 14 you.position = CGPoint(x: 0, y: 0) 15 you.physicsBody = SKPhysicsBody(circleOfRadius: you.frame.width / 2) 16 you.physicsBody?.categoryBitMask = youCategoryMask 17 you.physicsBody?.contactTestBitMask = targetCategoryMask 18 you.physicsBody?.collisionBitMask = 0 19 you.physicsBody?.affectedByGravity = true 20 addChild(you) 21 22 target.scale(to: CGSize(width: 90, height: 90)) 23 target.position = CGPoint(x: 0, y: -frame.height / 8) 24 target.physicsBody = SKPhysicsBody(circleOfRadius: target.frame.height / 2) 25 target.physicsBody?.categoryBitMask = targetCategoryMask 26 target.physicsBody?.contactTestBitMask = youCategoryMask 27 target.physicsBody?.collisionBitMask = 0 28 target.physicsBody?.affectedByGravity = true 29 addChild(target) 30 31 } 32} 33

別のclassに譲渡する時

下記のコードの時youtargetは衝突しません。

swift

1class MainGameScene: SKScene, SKPhysicsContactDelegate { 2 3 var you: SKSpriteNode! 4 var target: SKSpriteNode! 5 6 let youCategoryMask: UInt32 = 0b0001 7 let targetCategoryMask: UInt32 = 0b0010 8 9 override func didMove(to view: SKView) { 10 self.physicsWorld.contactDelegate = self 11 12 you = youNode(categoryMask: youCategoryMask, 13 contactMask: targetCategoryMask, 14 collisionMask: 0) 15 addChild(you) 16 17 target.scale(to: CGSize(width: 90, height: 90)) 18 target.position = CGPoint(x: 0, y: -frame.height / 8) 19 target.physicsBody = SKPhysicsBody(circleOfRadius: target.frame.height / 2) 20 target.physicsBody?.categoryBitMask = targetCategoryMask 21 target.physicsBody?.contactTestBitMask = youCategoryMask 22 target.physicsBody?.collisionBitMask = 0 23 target.physicsBody?.affectedByGravity = true 24 addChild(target) 25 26 } 27} 28

swift

1 2class youNode: SKSpriteNode { 3 4 init(categoryMask: UInt32!, 5 contactMask: UInt32!, 6 collisionMask: UInt32! 7 ) { 8 let uiImage: UIImage = UIImage(named: "you")! 9 let skImage: SKTexture = SKTexture(image: uiImage) 10 11 super.init(texture: skImage, color: .clear, size: CGSize(width: 100, height: 100)) 12 13 self.position = CGPoint(x: 0, y: 0) 14 self.physicsBody = SKPhysicsBody(circleOfRadius: self.frame.height / 2) 15 self.physicsBody?.categoryBitMask = categoryMask 16 self.physicsBody?.contactTestBitMask = contactMask 17 self.physicsBody?.collisionBitMask = collisionMask 18 self.physicsBody?.affectedByGravity = true 19 } 20 21 required init?(coder aDecoder: NSCoder) { 22 fatalError("init(coder:) has not been implemented") 23 } 24}

試したこと

self.physicsWorld.contactDelegateMainGameSceneに設定されているためyouNodeでのNodeの設定が反映されていない、と予想してself.physicsWorld.contactDelegateを一時的にyouNodeに設定しようと試みましたがうまくいきませんでした。

お願い

初心者質問で申し訳ありませんが、この問題を解決できる策をお持ちの方、ご教授していただけると助かります。
宜しくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

var you: SKSpriteNode!
ではなく

var you: youNode!

では無いでしょうか?
didBeginも省略されてますか?

投稿2021/12/28 03:16

tanakana

総合スコア150

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

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

Hkr-Y

2021/12/28 14:08 編集

var you: youNode!にしても問題は解決されませんでした。 またdidBeginは省略しており、didBeginに問題はありませんでした。
tanakana

2021/12/29 06:42

別のclassに譲渡してないとき 下記のコードの時youとtargetは衝突します。 このコードは動作確認されてますか? 衝突しないのですが・・
Hkr-Y

2022/01/02 14:21

申し訳ありません。記述ミスをしていました。 また正確にコードを確認したところ別の部分に問題がありました。 お手数おかけしてしまい申し訳ありません。 ご尽力感謝します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問