相交节点

时间:2016-08-07 17:18:48

标签: sprite-kit skspritenode

我有一个for循环,它将生成一个没有物理主体的SKSpriteNodes的踪迹

   for _ in 1..<25 {
       drawBlocks()
}

我有一个拥有物理身体的玩家对象(球)。

我正在尝试运行一个方法,当playerObject与我的for循环生成的SKSPriteNodes之一相交时,SKSpriteNode将消失。

在我的更新方法中,我有这个

if block.frame.intersects(playeObject.frame) == true {
blocks.removeFromParent()
}

我尝试添加一个print语句,如果该方法在两者相交时实际被调用,但它们没有。任何线索?

2 个答案:

答案 0 :(得分:1)

您也可以为您的块创建一个physicsBody而不给这些块阻止动态属性设置为true(false =静态对象),因此对于每个块:

iex(7)> Mix.Tasks.Phx.Routes.run ''
 page_path  GET  /       HelloWeb.PageController :index
hello_path  GET  /hello  HelloWeb.HelloController :index

关于你的CollisionTypes可能是:

block.physicsBody = SKPhysicsBody.init(edgeLoopFromRect: block.frame)
block.physicsBody?.mass = 1
block.physicsBody?.affectedByGravity = false
block.physicsBody?.restitution = 1
block.physicsBody?.dynamic = false
block.physicsBody?.usesPreciseCollisionDetection = true
block.physicsBody?.categoryBitMask = CollisionTypes.Block.rawValue
block.physicsBody?.contactTestBitMask = CollisionTypes. PlayerObject.rawValue

添加到您的enum CollisionTypes: UInt32 { case Block = 1 case PlayerObject = 2 } 块,并直接检查块和播放器之间的联系人playerObject.physicsBody?.contactTestBitMask

答案 1 :(得分:0)

物理学会使这更容易,但需要更多处理。使用物理,您可以选择使用didBeginContact()通知您联系人。请注意,您的播放器对象需要是动态的,而其他对象可能是静态的(dynamic = false)。静态对象不会与其他静态对象产生冲突。

不使用物理你应该工作的东西你需要在update()中检查碰撞。