gpt4 book ai didi

Swift:2个节点之间的接触检测?

转载 作者:行者123 更新时间:2023-11-28 09:28:35 25 4
gpt4 key购买 nike

好吧,所以我一直在关注各种其他 SO 链接并试图解决这个问题 - 我需要在 2 个节点之间进行接触检测。不是碰撞检测,我了解到这会导致节点相互弹跳。我不想让它们相互碰撞,我只想知道它们何时接触。

现在我有 2 个节点的物理体,saviorchicken1 以及地面 (ground),救世主 坐下。这些都在这里设置:

        savior.physicsBody?.dynamic = true
savior.physicsBody?.allowsRotation = false
savior.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(savior.size.width, savior.size.height))

chicken1.physicsBody?.dynamic = true
chicken1.physicsBody?.allowsRotation = false
chicken1.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(chicken1.size.width, chicken1.size.height))

ground.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(self.frame.size.width, groundTexture.size().height*2))
ground.physicsBody?.dynamic = false

我需要在 saviorchicken1 之间设置接触检测。似乎有多种方法可以做到这一点,但这是我放在一起的:

//Contact detection

self.physicsWorld.contactDelegate = self

savior.physicsBody?.categoryBitMask = saviorCategory
savior.physicsBody?.contactTestBitMask = animalCategory
savior.physicsBody?.collisionBitMask = 0

chicken1.physicsBody?.categoryBitMask = animalCategory
chicken1.physicsBody?.contactTestBitMask = saviorCategory
chicken1.physicsBody?.collisionBitMask = 0

func didBeginContact(contact: SKPhysicsContact) {

var firstBody : SKPhysicsBody
var secondBody : SKPhysicsBody

if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask
{
firstBody = contact.bodyA
secondBody = contact.bodyB
}
else {
firstBody = contact.bodyB
secondBody = contact.bodyA
}

if firstBody.categoryBitMask == 0 && secondBody.categoryBitMask == 1 {
println("they made contact")
}

}

此代码导致 savior 直接穿过 ground 并穿过 chicken1,没有接触检测,因为即使 savior chicken1 接触,没有任何反应。

我需要saviorground继续碰撞,但我不需要saviorchicken1碰撞,只需触摸。当他们接触时,程序需要执行一些事情。这是一团糟,但我该如何解决?

编辑:

这是我所拥有的,为清楚起见,animalCategory 已更改为 chickenCategory,并且未检测到接触。此外,savior 仍然从 ground 中掉落。

 self.physicsWorld.contactDelegate = self
var screenTouches = Bool()

let saviorCategory: UInt32 = 0x1 << 0
let chickenCategory: UInt32 = 0x1 << 1

savior.physicsBody?.categoryBitMask = saviorCategory
savior.physicsBody?.contactTestBitMask = chickenCategory
savior.physicsBody?.collisionBitMask = chickenCategory

chicken1.physicsBody?.categoryBitMask = chickenCategory
chicken1.physicsBody?.contactTestBitMask = saviorCategory
chicken1.physicsBody?.collisionBitMask = saviorCategory

func didBeginContact(contact: SKPhysicsContact) {

var firstBody : SKPhysicsBody
var secondBody : SKPhysicsBody

if contact.bodyA.categoryBitMask == chickenCategory && contact.bodyB.categoryBitMask == saviorCategory {
println("contact made")
savior.hidden = true
}
else if contact.bodyA.categoryBitMask == saviorCategory && contact.bodyB.categoryBitMask == chickenCategory {
println("contact made")
savior.hidden = true
}
}

最佳答案

好吧,看起来你想要的只是检测它们是否接触过,但你不希望它们相互插入。我会在 didBeginContact 中将碰撞检测放在它们之间,使它们的 physicsbody = nil,这样当它们发生碰撞时它就知道它们发生了碰撞,并且当您将其放置时它使它们相互穿过。如果你想用代码来做其他事情,只需在让 physicsbody 为 nil 之前输入代码即可。另外,如果你想把他们的物理体放回去,就把它放回去。

关于Swift:2个节点之间的接触检测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29527084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com