したいこと
制作するnodeの設定を別のclassに譲渡してコードの可読性を高めたい。
できないこと
別のclassでnodeの設定を行うと、正しく設定が適応されない。
その結果、衝突判定が発生しない。
別のclassに譲渡してないとき
(コード簡略化のため一部コードを省略してます)
下記のコードの時you
とtarget
は衝突します。
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に譲渡する時
下記のコードの時you
とtarget
は衝突しません。
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.contactDelegate
がMainGameScene
に設定されているためyouNode
でのNodeの設定が反映されていない、と予想してself.physicsWorld.contactDelegate
を一時的にyouNode
に設定しようと試みましたがうまくいきませんでした。
お願い
初心者質問で申し訳ありませんが、この問題を解決できる策をお持ちの方、ご教授していただけると助かります。
宜しくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/28 14:08 編集
2021/12/29 06:42
2022/01/02 14:21