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

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

ただいまの
回答率

90.50%

  • Swift

    7243questions

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

didBegin が動作しない。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 87

Ponkiti27

score 2

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

import UIKit
import SpriteKit
import GameplayKit

class Stage01: SKScene, SKPhysicsContactDelegate{
    var ball: SKSpriteNode!
    var balltext: SKTexture!

    var square: SKSpriteNode!
    var squaretext: SKTexture!

    let cameraNode = SKCameraNode()

    var savey: CGFloat = 0
    var touch: Bool = false
    var gzero: Bool = false
    let smoke = SKEmitterNode(fileNamed: "smoke")

    override func didMove(to view: SKView){
        physicsBody = SKPhysicsBody(edgeLoopFrom: CGRect(x:0, y:0, width: ws, height: hs))
        physicsWorld.gravity = CGVector(dx: 0.0, dy: -gra)
        sita = 0.0

        addball(xbp:0,ybp:2)
        addsquare(xs:15,ys:2,xp:0,yp:5)
        addsquare(xs:15,ys:2,xp:0,yp:-5)
        addsquare(xs:2,ys:10,xp:6,yp:0)

        cameraNode.position = ball.position
        cameraNode.xScale = 1.0
        cameraNode.yScale = 1.0
        addChild(cameraNode)
        camera = cameraNode
    }

    func addsquare(xs:Int ,ys:Int, xp:Int, yp:Int ){
        squaretext = SKTexture(imageNamed: "square")
        square = SKSpriteNode(texture: squaretext)
        square.scale(to: CGSize(width: w / 10 * CGFloat(xs), height: w / 10 *  CGFloat(ys)))
        square.position = CGPoint(x: ws / 2 + w / 10 * CGFloat(xp), y: hs / 2 + w / 10 * CGFloat(yp))
        square.physicsBody = SKPhysicsBody(texture: squaretext, size: square.frame.size)
        square.physicsBody?.restitution = 0.0
        square.physicsBody?.affectedByGravity = false
        square.physicsBody?.isDynamic = false
        square.physicsBody?.categoryBitMask = 0b0010
        square.physicsBody?.contactTestBitMask = 0b0001
        square.physicsBody?.collisionBitMask = 0b0001
        addChild(square)
    }

    func addball(xbp:Int ,ybp:Int){
        balltext = SKTexture(imageNamed: "ball")
        ball = SKSpriteNode(texture: balltext)
        ball.scale(to: CGSize(width: w / 5  ,height: w / 5 ))
        ball.position = CGPoint(x: ws / 2 + w / 10 * CGFloat(xbp), y: hs / 2 + w / 10 * CGFloat(ybp))
        ball.physicsBody = SKPhysicsBody(texture: balltext, size: CGSize(width: ball.frame.width / CGFloat(1.1), height: ball.frame.height / CGFloat(1.1)))
        ball.physicsBody?.restitution = 0.0
        ball.physicsBody?.categoryBitMask = 0b0001
        ball.physicsBody?.contactTestBitMask = 0b0010
        ball.physicsBody?.collisionBitMask = 0b0010
        addChild(ball)
    }

    func didBegin(_ contact: SKPhysicsContact) {
        if contact.bodyA.categoryBitMask == 0b0001{
            gameover()
        }else if contact.bodyB.categoryBitMask == 0b0001{
            gameover()
        }
    }

    func gameover() {
        let gameoverLabel = SKLabelNode(text: "GAME OVER")
        gameoverLabel.fontSize = 30
        gameoverLabel.fontColor = .blue
        gameoverLabel.position = ball.position
        gameoverLabel.zPosition = 10
        addChild(gameoverLabel)
        gameoverFlg = true
        isPaused = true
        Timer.scheduledTimer(timeInterval: 3,target: self,selector: #selector(Stage01ViewController.back),userInfo: nil,repeats: false)
    }

回答よろしくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/29 22:01

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

    キャンセル

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Swift

    7243questions

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