swiftの勉強を始めたばかりの初心者ですが、よろしくお願いします。
physicsBody?.categoryBitMask & collisionBitMask & contactTestBitMaskなどの設定はあっているように思うのですが、どうにも判定受け取れません。何か違うところに問題があるように思えるのですが、お知恵をお貸しいただけたら幸いです。
class GameScene: SKScene,SKPhysicsContactDelegate { 〜〜略〜〜 let controllarea = SKShapeNode(rectOf: CGSize(width:1500 ,height:400)) let guideSprite = SKShapeNode(circleOfRadius: 30) 〜〜略〜〜 //カテゴリー分け let category_guide: UInt32 = 1 << 1 let category_box: UInt32 = 1 << 2 override func didMove(to view: SKView) { self.backgroundColor = UIColor.white self.physicsBody = SKPhysicsBody(edgeLoopFrom: self.frame)//物理空間を作る self.physicsWorld.gravity = CGVector(dx:0,dy:0)//重力を切る self.physicsWorld.contactDelegate = self//衝突情報を自分で受ける 〜〜略〜〜 //boxづくり for i in 0...5 { for h in 0...5{ let townSprite = SKShapeNode(rectOf: CGSize(width:200 ,height:200)) townSprite.fillColor = UIColor.blue townSprite.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width:200 ,height:200)) townSprite.physicsBody?.isDynamic = false townSprite.physicsBody?.categoryBitMask = category_box townSprite.physicsBody?.collisionBitMask = category_guide townSprite.physicsBody?.contactTestBitMask = category_guide townSprite.position = CGPoint (x: -1000 + 400 * h, y: -1000 + 400 * i) ad_x = -1000 + 400 * h ad_y = -1000 + 400 * i addressArray_x.append(ad_x) addressArray_y.append(ad_y) townArray.append(townSprite) } guideSprite.fillColor = UIColor.red guideSprite.physicsBody = SKPhysicsBody(circleOfRadius: 30) guideSprite.physicsBody?.isDynamic = false guideSprite.physicsBody?.categoryBitMask = category_guide guideSprite.physicsBody?.collisionBitMask = category_box guideSprite.physicsBody?.contactTestBitMask = category_box guideSprite.position = CGPoint(x: 500,y: 800) self.addChild(guideSprite) //コントローラー表示 controllarea.fillColor = UIColor(red: 0.6,green: 0.0 ,blue: 0.4,alpha: 0.5) controllarea.physicsBody?.isDynamic = false controllarea.position = CGPoint(x:0 ,y:0) self.addChild(controllarea) ~~~~~~~略~~~~~ }//did //コントロールする override func update(_ currentTime: TimeInterval) { //上: 〜〜略〜〜 //下: 〜〜略〜〜 //左: 〜〜略〜〜 //右: 〜〜略〜〜 } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { for touch: AnyObject in touches { let location = touch.location(in: self) let touchNode = self.atPoint(location) 〜〜略〜〜 } } //touchBegan override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { for touch: AnyObject in touches { let location = touch.location(in: self) let touchNode = self.atPoint(location) 〜〜略〜〜 } } func didBegin(_ contact: SKPhysicsContact) { 〜〜略〜〜 } func didEnd(_ contact: SKPhysicsContact) { 〜〜略〜〜 } }
判定受け取れないというのはdidBegin(_:)が呼ばれないということでしょうか?
お世話になります。はい、didBeginが呼ばれないです。
実際に確認できないので色々とテストしていただけますか?(リファレンス読みましたがイマイチ理解出来ませんでした)(その1)townSpriteとguideSpriteのcontactTestBitMaskの指定を逆にしてみる。(その2)両方のcontactTestBitMaskの指定をcategory_guide|category_boxにしてみる。(その3)両方のcontactTestBitMaskの指定を0xffffffffにしてみる。以上です。ちなみに、画面上ではちゃんと衝突してるんですよね?
色々と丁寧に考えて頂き本当にありがとうございます。このプログラムの概要は、碁盤の目のように並んだ箱の街を赤いボールがコントロールキー(画面上に作ったもの)の操作で移動をして行くと、言ったものでして、箱とボールが衝突した時にそれ以上その方向には動かないようにするために衝突判定をさせたいのですが、完全にボールは箱の上を通過してしまう次第です。アドバイス通りにテストしてみましたがやはり呼び込まれないです。didBeginの中にprint()でフラグを準備してますが立ちません。本来ならプログラム全て載せたいところですが文字数制限があって叶いません。ケアレスミスなのか文法のミスなのか判らない次第です。もっと自分なりに考えてみますが、何かお気付きの点がありましたら教えていただけるとありがたいです。本当に貴重な時間を使わせてしまってすみません。
実際に使ったことがないのであまり自信が無いのですが、少なくともcategoryBitMaskとcollisionBitMaskの設定は間違っていないようなので、画面上では衝突していると思ったのですが、それすらしていないとなると、Maskの設定ではなく他の部分に問題がありそうですね。もっとシンプルなプログラムでテストしてみてはどうでしょうか?
回答1件
あなたの回答
tips
プレビュー