私はちょうど2つのスプライトは非常に最初からオーバーラップし、接触が私のために検出されていることを確認しようとしました。適切に特定の物体間の接触を検出するために、
import SpriteKit
struct Collider {
static let SmallSquare : UInt32 = 1 << 0
static let BigSquare : UInt32 = 1 << 1
}
class GameScene: SKScene, SKPhysicsContactDelegate {
override func didMoveToView(view: SKView) {
self.physicsWorld.contactDelegate = self
let smallSquare = SKSpriteNode(color: .orangeColor(), size: CGSize(width: 50, height:50))
smallSquare.zPosition = 2
smallSquare.position = CGPoint(x: frame.midX, y: frame.midY)
smallSquare.physicsBody = SKPhysicsBody(rectangleOfSize: smallSquare.size)
smallSquare.physicsBody?.affectedByGravity = false
smallSquare.physicsBody?.categoryBitMask = Collider.SmallSquare
smallSquare.physicsBody?.contactTestBitMask = Collider.BigSquare
smallSquare.physicsBody?.collisionBitMask = 0
addChild(smallSquare)
let bigSquare = SKSpriteNode(color: .purpleColor(), size: CGSize(width: 200, height: 200))
bigSquare.zPosition = 1
bigSquare.position = CGPoint(x: frame.midX, y: frame.midY)
bigSquare.physicsBody = SKPhysicsBody(rectangleOfSize: bigSquare.size)
bigSquare.physicsBody?.affectedByGravity = false
bigSquare.physicsBody?.categoryBitMask = Collider.BigSquare
bigSquare.physicsBody?.contactTestBitMask = Collider.SmallSquare
bigSquare.physicsBody?.collisionBitMask = 0
addChild(bigSquare)
}
func didBeginContact(contact: SKPhysicsContact) {
print("Contact detected")
}
}
後で、あなたはこのような何かを行う必要があります:ここでは、コードです
func didBeginContact(contact: SKPhysicsContact) {
var firstBody, secondBody: SKPhysicsBody
if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
firstBody = contact.bodyA
secondBody = contact.bodyB
} else {
firstBody = contact.bodyB
secondBody = contact.bodyA
}
if ((firstBody.categoryBitMask & Collider.SmallSquare) != 0 &&
(secondBody.categoryBitMask & Collider.BigSquare != 0)) {
print ("Contact detected")
}
}
しかし、ゲームがある場合でもそのせずに、メッセージが出力されます最初に始まったのは物理的な世界で接触が検出されたからです。
良い質問ですが、私はゲームタッチを開始するスプライトノードがdidBeginContactと動作しないと思います。私はあなたの唯一の他の選択肢はdidEndContactだと思うが、それはあなたが望むものではないようだ。 – Steve
didBeginContactがすでに2つのボディに接触しているかどうかテストしましたか?論理的には、シーンの最初の通過中に、物理エンジンが2つの物理ボディをオーバーラップしていると判断した場合、didBeginContactが呼び出されます。その後、これらのボディをリストに追加し、まだタッチしている場合は次のパスでdidBeginContactを呼び出しませんが、もはやタッチしてリストから削除しないとdidEndContactを呼び出します。 –
あなたの答えをありがとう、残念ながらdidBeginContactは呼ばれません。私はあなたが言ったのと同じようにしました! – Oscar