【问题标题】:spritekit objects not detect each otherspritekit 对象不检测到对方
【发布时间】:2017-07-13 20:50:36
【问题描述】:

我正在做一个小游戏,比如小鸟。我不知道为什么物体不能“看到”我们自己。 我添加了墙、地面和幽灵,很奇怪,幽灵检测到地面,反之亦然,但墙仍然不可见。为什么?

鬼应该停在垂直的矩形(墙)上,而不是倒在地上。

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)

    }

【问题讨论】:

  • 你能在 GameViewController 中将 showPhysics 设置为 true,以便显示物理实体吗?
  • 没有帮助:(但实际上显示了物理,但仅适用于地面和幽灵,不适用于墙壁。
  • 那么我猜这堵墙没有物理体,出于某种奇怪的原因。尝试在设置 wall 的 PB 后在某处放置 print("Wall's PB is (wall.physicsbody)") 以确认这一点。
  • 试试这个例子中的 checkPhysics() 函数:stackoverflow.com/documentation/sprite-kit/6261/…。将函数复制到您的代码中,并在设置完所有内容后通过 checkPhysics() 调用它。
  • 什么不起作用?

标签: swift sprite-kit collision-detection collision


【解决方案1】:

看看这个:

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

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

可选链是查询和调用当前可能为 nil 的可选的属性、方法和下标的过程。如果可选包含值,则属性、方法或下标调用成功;如果可选项为 nil,则属性、方法或下标调用返回 nil。

现在,赋值也是可选链的一部分。所以如果一个属性为 nil,赋值就会失败。

在您的情况下,physicsBody 属性为 nil,因此 = 运算符右侧的任何代码都不会被计算。

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

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

与此无关,但要记住的一件好事:

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

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

【讨论】:

  • 很好发现 - 我错过了额外的“?”。但我对 PB 不存在的看法是对的 :-)
  • @Whirlwind 非常感谢您!可能我复制了一些代码,并没有注意到这个问号..
  • 谢谢@SteveIves 我必须说那些小错误是邪恶的:)
猜你喜欢
  • 1970-01-01
  • 2020-10-17
  • 2014-12-07
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多