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

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

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

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

Q&A

解決済

1回答

1812閲覧

didBegin が動作しない。

Ponkiti27

総合スコア9

Swift

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

0グッド

0クリップ

投稿2018/07/29 10:08

衝突時に呼び出されるdidBeginメソッドの動作を確認する為に、ボールが四角のオブジェクトに接触するとゲームオーバーと表示されうコードを書いてみたのですが、ボールが四角のオブジェクトに接触してもゲームオーバーと表示されません。
didBeginが動作していないと思ったので、contactTestBitMaskの値を変えるなど色々試してみたのですが結果は変わりません。
physicsBodyの設定方法が間違っているのでしょうか?
didBeginが動作しない原因が分かる方どうかよろしくお願い致します。

swift

1import UIKit 2import SpriteKit 3import GameplayKit 4 5class Stage01: SKScene, SKPhysicsContactDelegate{ 6 var ball: SKSpriteNode! 7 var balltext: SKTexture! 8 9 var square: SKSpriteNode! 10 var squaretext: SKTexture! 11 12 let cameraNode = SKCameraNode() 13 14 var savey: CGFloat = 0 15 var touch: Bool = false 16 var gzero: Bool = false 17 let smoke = SKEmitterNode(fileNamed: "smoke") 18 19 override func didMove(to view: SKView){ 20 physicsBody = SKPhysicsBody(edgeLoopFrom: CGRect(x:0, y:0, width: ws, height: hs)) 21 physicsWorld.gravity = CGVector(dx: 0.0, dy: -gra) 22 sita = 0.0 23 24 addball(xbp:0,ybp:2) 25 addsquare(xs:15,ys:2,xp:0,yp:5) 26 addsquare(xs:15,ys:2,xp:0,yp:-5) 27 addsquare(xs:2,ys:10,xp:6,yp:0) 28 29 cameraNode.position = ball.position 30 cameraNode.xScale = 1.0 31 cameraNode.yScale = 1.0 32 addChild(cameraNode) 33 camera = cameraNode 34 } 35 36 func addsquare(xs:Int ,ys:Int, xp:Int, yp:Int ){ 37 squaretext = SKTexture(imageNamed: "square") 38 square = SKSpriteNode(texture: squaretext) 39 square.scale(to: CGSize(width: w / 10 * CGFloat(xs), height: w / 10 * CGFloat(ys))) 40 square.position = CGPoint(x: ws / 2 + w / 10 * CGFloat(xp), y: hs / 2 + w / 10 * CGFloat(yp)) 41 square.physicsBody = SKPhysicsBody(texture: squaretext, size: square.frame.size) 42 square.physicsBody?.restitution = 0.0 43 square.physicsBody?.affectedByGravity = false 44 square.physicsBody?.isDynamic = false 45 square.physicsBody?.categoryBitMask = 0b0010 46 square.physicsBody?.contactTestBitMask = 0b0001 47 square.physicsBody?.collisionBitMask = 0b0001 48 addChild(square) 49 } 50 51 func addball(xbp:Int ,ybp:Int){ 52 balltext = SKTexture(imageNamed: "ball") 53 ball = SKSpriteNode(texture: balltext) 54 ball.scale(to: CGSize(width: w / 5 ,height: w / 5 )) 55 ball.position = CGPoint(x: ws / 2 + w / 10 * CGFloat(xbp), y: hs / 2 + w / 10 * CGFloat(ybp)) 56 ball.physicsBody = SKPhysicsBody(texture: balltext, size: CGSize(width: ball.frame.width / CGFloat(1.1), height: ball.frame.height / CGFloat(1.1))) 57 ball.physicsBody?.restitution = 0.0 58 ball.physicsBody?.categoryBitMask = 0b0001 59 ball.physicsBody?.contactTestBitMask = 0b0010 60 ball.physicsBody?.collisionBitMask = 0b0010 61 addChild(ball) 62 } 63 64 func didBegin(_ contact: SKPhysicsContact) { 65 if contact.bodyA.categoryBitMask == 0b0001{ 66 gameover() 67 }else if contact.bodyB.categoryBitMask == 0b0001{ 68 gameover() 69 } 70 } 71 72 func gameover() { 73 let gameoverLabel = SKLabelNode(text: "GAME OVER") 74 gameoverLabel.fontSize = 30 75 gameoverLabel.fontColor = .blue 76 gameoverLabel.position = ball.position 77 gameoverLabel.zPosition = 10 78 addChild(gameoverLabel) 79 gameoverFlg = true 80 isPaused = true 81 Timer.scheduledTimer(timeInterval: 3,target: self,selector: #selector(Stage01ViewController.back),userInfo: nil,repeats: false) 82 } 83```回答よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

self.physicsWorld.contactDelegate = self
が抜けてませんか?

投稿2018/07/29 12:51

tanakana

総合スコア150

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

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

Ponkiti27

2018/07/29 13:01

ありがとうございます。 self.physicsWorld.contactDelegate = self を入れたら解決しました。 その一文が抜けてることに全く気づかなかったです。 スッキりしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問