我试图让“阻挡”与“地面”发生碰撞,而不是挡住地面并消失!
这是我的代码
hero = CSHero()
hero.position = CGPointMake(70, movingGround.position.y + movingGround.frame.size.height/2 + hero.frame.size.height/2)
hero.physicsBody = SKPhysicsBody(rectangleOfSize: hero.size)
hero.physicsBody?.dynamic = true
hero.physicsBody?.contactTestBitMask = heroCategory | groundCategory
hero.physicsBody?.collisionBitMask = heroCategory | groundCategory
addChild(hero)
这是我的地面守则
let ground1 = SKSpriteNode(color: UIColor.blackColor(), size: CGSizeMake(view.frame.size.width, 15))
ground1.position = view.center
ground1.physicsBody = SKPhysicsBody(rectangleOfSize: ground1.size)
ground1.physicsBody!.dynamic = false
ground1.physicsBody!.contactTestBitMask = groundCategory | heroCategory
ground1.physicsBody!.collisionBitMask = groundCategory | heroCategory
addChild(ground1)
每次运行它时,如果我将动态设置为true,那么块就会消失。
任何帮助?
答案 0 :(得分:1)
你忘记了物理碰撞逻辑的一个非常重要的部分:categoryBitMask
。 categoryBitMask
属性告诉系统它是什么类型的对象。您实际上是告诉系统您希望每个对象与之碰撞但您忘记告诉系统它们实际上是什么类型的对象。
为了进一步说明,只有当你确实想要在两件事发生碰撞但不希望他们的物理机构相互作用时得到通知时才需要contactTestBitMask
。 (想想当马里奥击中一枚硬币的时候。他没有弹出它,但你需要在更新硬币计数时收到有关所述碰撞的通知)。 collisionBitMask
告诉系统实际物理碰撞的物体。但是这个属性需要与categoryBitMask
配对才能真正发挥作用。
现在,您拥有所需的一切。不需要Dynamic
。您需要做的是添加以下两行代码:
ground1.physicsBody?.categoryBitMask = groundCategory
hero.physicsBody?.categoryBitMask = heroCategory
我希望这有帮助!