以下は私の "Floor.swift"クラスで、基本的には壁の束です。私は、画面の上から来るオブジェクトを持っていて、FloorとSKSpriteNodesが衝突すると、SKSpriteNodeを削除したいと思います。以下は私のフロアクラスです。SKPhysicsBody Collision Not Working
import Foundation
import SpriteKit
class Floor: SKNode {
override init() {
super.init()
let leftWall = SKSpriteNode(color: UIColor.clear, size: CGSize(width: 5, height: 50))
leftWall.position = CGPoint(x: 0, y: 50)
leftWall.physicsBody = SKPhysicsBody(rectangleOf: leftWall.size)
leftWall.physicsBody!.isDynamic = false
self.addChild(leftWall)
let rightWall = SKSpriteNode(color: UIColor.clear, size: CGSize(width: 5, height: 50))
rightWall.position = CGPoint(x: 375, y: 50)
rightWall.physicsBody = SKPhysicsBody(rectangleOf: rightWall.size)
rightWall.physicsBody!.isDynamic = false
self.addChild(rightWall)
let bottomWall = SKSpriteNode(color: UIColor.clear, size: CGSize(width: 500, height: 10))
bottomWall.position = CGPoint(x: 150, y: -5)
bottomWall.physicsBody = SKPhysicsBody(rectangleOf: bottomWall.size)
bottomWall.physicsBody!.isDynamic = false
self.addChild(bottomWall)
self.physicsBody = SKPhysicsBody(bodies: [leftWall.physicsBody!, rightWall.physicsBody!, bottomWall.physicsBody!])
self.physicsBody?.categoryBitMask = floorCategory
self.physicsBody?.contactTestBitMask = nailDropCategory | pointCategory | lifeCategory
self.physicsBody?.collisionBitMask = balloonCategory
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemted")
}
}
GameSceneクラス下の "FUNC didBegin(_接触:SKPhysicsContact)" 私は書いた:
func didBegin(_ contact: SKPhysicsContact) {
if (contact.bodyA.categoryBitMask == nailDropCategory | pointCategory | lifeCategory) && (contact.bodyB.categoryBitMask == floorCategory) {
// contact.bodyB.node!.removeFromParent()
print("COLLISION")
}
}
あなたが見ることができるように、私の床クラスで私はself.physicsBody = SKPhysicsBody」としてオブジェクトを設定しました(bodies :) "を私のSKSpriteNodeで置き換えます。しかし何らかの理由で私はこれまでどんな検出が得られていない。私は自分の "Floor"クラスを、objectCategory、pointCategory、lifeCategoryの各クラスの "contactTestBitMask"にしました。これは今私が何分も考えていない問題です。
更新:
ここでこのコードを使用していますが、動作しています。問題は、デフォルトのケースでも私の "balloonCategory"も削除されているので、それをやりたくはありません。そのカテゴリだけを無視するだけでなく、バルーンの壁としても機能するようにするにはどうすればよいですか?
func didBegin(_ contact: SKPhysicsContact) {
let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
switch contactMask {
case balloonCategory | nailDropCategory:
print("nailDrop and balloon have contacted.")
contact.bodyB.node!.removeFromParent()
self.run(SKAction.playSoundFileNamed("lostlifesound.mp3", waitForCompletion:false))
lifeLost -= 1
case balloonCategory | pointCategory:
print("point and balloon have contacted.")
contact.bodyB.node!.removeFromParent()
totalPoints += 2
self.run(SKAction.playSoundFileNamed("pointsound.mp3", waitForCompletion:false))
case balloonCategory | lifeCategory:
print("life and balloon have contacted.")
contact.bodyB.node!.removeFromParent()
lifeLost += 1
self.run(SKAction.playSoundFileNamed("pointsound.mp3", waitForCompletion:false))
default:
contact.bodyB.node!.removeFromParent()
print("Removed \(String(describing: contact.bodyB.node!.name))")
}
}
nailDropCategory? pointCategory? lifeCategory?ビットマスクをどのように定義するかはわかりません。 –
さて、私は他のすべてのクラスでそれを定義しました。他のすべての衝突はうまく動いていますので、私は忘れました。 – Dewan
物理が既にプロジェクトで動作している場合は、このように動作するはずです。 Githubのサンプルプロジェクトと共有でこの問題を再現できますか?ソリューションのようなデバッグから来るかもしれないようだ。 – peacetype