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

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

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

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

748閲覧

spritekitの衝突判定がうまくできない

tsuneet

総合スコア16

SpriteKit

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2019/10/13 23:52

spritekitで2つのノード間の衝突判定がうまく出来ません。
次のコードでsprite1とsprite2の衝突させようとしています。
実機シミュレーションではsprite1が上から落下してsprite2にぶつかって物体として認識はできているのですが、衝突したときに呼ばれるはずのdidBeginが呼び出されません。

print("衝突?")の部分までは実行されますが、didBegin内のprint("衝突認識!")までの実行が行えていない状態です。
以前の質問が冗長であったため簡略化して再度質問させていただきました。
よろしくおねがいします。

swift

1// playScene.swift 2// denkiEido 3// 4// Created by takeuchi tsunehiro on 2019/09/25. 5// Copyright © 2019 takeuchi tsunehiro. All rights reserved. 6// 7 8import Foundation 9import SpriteKit 10import CoreMotion 11 12 13class playScene: SKScene,SKPhysicsContactDelegate { 14 15 16 (中略) 17 18 19 func createEnemy(){ 20 21 22 //ピペットノードの設定 23 let texture = SKTexture(imageNamed:"pipet") 24 let sprite1 = SKSpriteNode(texture:texture) 25 sprite1.position = CGPoint(x:130,y:880) 26 sprite1.size=CGSize(width:texture.size().width*0.5,height:texture.size().height*0.5) 27 sprite1.physicsBody = SKPhysicsBody(texture:texture,size:sprite1.size) 28 sprite1.physicsBody?.isDynamic = true 29 self.addChild(sprite1) 30 31 //ビーカーノードの設定 32 let texture2 = SKTexture(imageNamed: "bika") 33 let sprite2 = SKSpriteNode(texture:texture2) 34 sprite2.position = CGPoint(x:130,y:150) 35 sprite2.size=CGSize(width:texture2.size().width*0.5,height:texture2.size().height*0.5) 36 sprite2.physicsBody = SKPhysicsBody(texture:texture2,size:sprite2.size) 37 sprite2.physicsBody?.isDynamic = false 38 self.addChild(sprite2) 39 40 41 //衝突処理 42 43 sprite1.physicsBody?.categoryBitMask=0b0001 44 sprite2.physicsBody?.categoryBitMask=0b0010 45 46 sprite1.physicsBody?.collisionBitMask=0b0010 47 sprite2.physicsBody?.collisionBitMask = 0b0001 48 49 sprite1.physicsBody?.contactTestBitMask=0b0010 50 sprite2.physicsBody?.contactTestBitMask=0b0001 51 52 //デリゲート先に自分を設定する 53 self.physicsWorld.contactDelegate=self 54 print("衝突?") 55 56 } 57 58 func didBegin(_contact: SKPhysicsContact) { 59 print("衝突認識!") 60 } 61 62 63 64 65 override func didMove(to view: SKView) { 66 let timerTeki = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (Timer) in 67 self.createEnemy() 68 } 69 } 70} 71 72(略) 73 74

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

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

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

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

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

guest

回答1

0

自己解決

原因は不明ですが、他のゲームのサンプルコードを真似したらうまくいきました。
根本的な原因解決にはなっていませんが…。
下記のように別のクラスを追記しました。

extension playScene: SKPhysicsContactDelegate {

func didBegin(_ contact: SKPhysicsContact) {

print("衝突しました")

}
}

もともとの
lass playScene: SKScene,SKPhysicsContactDelegate {}
からSKPhysicsContactDelegateの文字は消しています。
なぜこの方法でうまくいくのか全くわかりませんが、衝突の認識はしてもらえたので自己解決ということで投稿させていただきました。

投稿2019/10/14 08:40

tsuneet

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問