我有一个for循环,它将生成一个没有物理主体的SKSpriteNodes的踪迹
for _ in 1..<25 {
drawBlocks()
}
我有一个拥有物理身体的玩家对象(球)。
我正在尝试运行一个方法,当playerObject与我的for循环生成的SKSPriteNodes之一相交时,SKSpriteNode将消失。
在我的更新方法中,我有这个
if block.frame.intersects(playeObject.frame) == true {
blocks.removeFromParent()
}
我尝试添加一个print语句,如果该方法在两者相交时实际被调用,但它们没有。任何线索?
答案 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()中检查碰撞。