spritekit 对象不相互检测

spritekit objects not detect each other

我正在制作一个小游戏,比如飞扬的小鸟。我不知道为什么对象不是 "see" 我们自己。 我添加了墙、地面和幽灵,很奇怪的是,幽灵检测到地面,反之亦然,但墙仍然不可见。为什么?

幽灵应该停在竖直的矩形(墙)上,而不是掉在地上。

struct PhysicsCatagory{
    static let Ghost : UInt32 = 0x1 << 1  
    static let Wall : UInt32 = 0x1 << 2
    static let Ground : UInt32 = 0x1 << 3
}

class GameScene: SKScene{

   var Ground = SKSpriteNode()
   var Ghost = SKSpriteNode()
   var Wall = SKSpriteNode()



    override func didMove(to view: SKView) {

        /*******adding ground***/
        Ground = SKSpriteNode(imageNamed: "Ground")
        Ground.setScale(0.7)
        Ground.position = CGPoint(x: self.frame.midX, y: self.frame.minY)

        Ground.physicsBody = SKPhysicsBody(rectangleOf: Ground.size)
        Ground.physicsBody?.categoryBitMask = PhysicsCatagory.Ground
        Ground.physicsBody?.collisionBitMask = PhysicsCatagory.Ghost
        Ground.physicsBody?.contactTestBitMask = PhysicsCatagory.Ghost
        Ground.physicsBody?.affectedByGravity = false
        Ground.physicsBody?.isDynamic = false
        Ground.zPosition = 3
        self.addChild(Ground)

        /*******adding wall (not working)****/
        Wall = SKSpriteNode(imageNamed: "Wall")
        Wall.setScale(0.7)
        Wall.position = CGPoint(x: self.frame.midX, y: self.frame.midY + 100)

        Wall.physicsBody? = SKPhysicsBody(rectangleOf: Wall.size)
        Wall.physicsBody?.categoryBitMask = PhysicsCatagory.Wall
        Wall.physicsBody?.collisionBitMask = PhysicsCatagory.Ghost
        Wall.physicsBody?.contactTestBitMask = PhysicsCatagory.Ghost
        Wall.physicsBody?.affectedByGravity = false
        Wall.physicsBody?.isDynamic = false
        Wall.zPosition = 1
        self.addChild(Wall)


        /*******adding ghost***/
        Ghost = SKSpriteNode(imageNamed: "Ghost")
        Ghost.size = CGSize(width: 90, height: 100)
        Ghost.position = CGPoint(x: self.frame.midX, y: self.frame.maxY)

        Ghost.physicsBody = SKPhysicsBody(circleOfRadius: 50)
        Ghost.physicsBody?.categoryBitMask = PhysicsCatagory.Ghost
        Ghost.physicsBody?.collisionBitMask = PhysicsCatagory.Wall | PhysicsCatagory.Ground
        Ghost.physicsBody?.contactTestBitMask = PhysicsCatagory.Wall | PhysicsCatagory.Ground
        Ghost.physicsBody?.affectedByGravity = true
        Ghost.physicsBody?.isDynamic = true
        Ghost.zPosition = 2
        self.addChild(Ghost)

    }

看看这个:

Wall.physicsBody? = SKPhysicsBody(rectangleOf: Wall.size)

注意这里的问号。用于指定optional chaining:

Optional chaining is a process for querying and calling properties, methods, and subscripts on an optional that might currently be nil. If the optional contains a value, the property, method, or subscript call succeeds; if the optional is nil, the property, method, or subscript call returns nil.

现在,赋值也是可选链的一部分。因此,如果 属性 为 nil,则赋值将失败。

在您的例子中,physicsBody 属性 为 nil,因此计算 = 运算符右侧代码的 none。

要完成这项工作,请执行以下操作:

Wall.physicsBody = SKPhysicsBody(rectangleOf: Wall.size)

与此无关,但要牢记的好事:

如果您对两个物体之间的接触检测感兴趣,至少其中一个必须是动态的。我指出这一点是因为您的 Wall 和 Ground 对象是静态的,这意味着无论您如何设置接触掩码,都不会检测到它们之间的接触。

哦,是的,使用驼峰命名法 类、属性等。