SpriteKit SKPhysicsBody只在一个方向上发生碰撞,就像一扇只能前进而不能后退的门。

6
在SpriteKit中,SKPhysicsBody是否可以创建一个物体,你可以从它的一侧穿过去但不能回头。这个想法是在一个方向上没有碰撞,所以你可以穿过并且不会返回,就像一个陷阱门。
4个回答

1

我不太确定物理学的实现方式,但是在游戏运行时您应该能够更改物理主体的碰撞位掩码以达到类似的效果。

因此,当门检测到玩家接触它时,您可以将其设置为开启状态,并更改位掩码,以便玩家与之发生碰撞。这应该允许玩家单向通过,但不能返回。

*实际上,让门通过玩家的物理主体检测玩家何时不再接触门,并根据陷阱门或普通门的情况测试x或y位置。如果位置足够远离门,则更改门的碰撞位掩码,以使玩家无法通过。


1
解决方案就是更改collisionBitMask。
func platformSolid() {
     self.physicsBody?.collisionBitMask = kBIT_MASK_PLAYER | kBIT_MASK_WALL | kBIT_MASK_PLATFORM
}
func platformThrough() {
    self.physicsBody?.collisionBitMask = kBIT_MASK_PLAYER | kBIT_MASK_WALL
}

在这个例子中,self 是玩家碰撞位掩码。
在委托方法中:
func didEndContact(contact: SKPhysicsContact) {
    if contact.bodyB.categoryBitMask == kBIT_MASK_PLATFORM {
        player.platformSolid()
    }
}

所以一旦玩家通过(didEndContact),你会使平台(门)变得坚固。

0
在门和物体的接触测试中,您需要检查物体行进的方向(可以使用速度来获取此信息)。如果物体朝着门会挡住它们的方向行进,则将一个值放在门的categoryBitMask上(以一种方式设置它,使其与节点collisionBitMask进行AND运算,从而创建一个值> 0),否则您需要删除门的categoryBitMask(或以一种方式设置它,使其不与节点collisionBitMask进行AND运算,从而创建一个值为0)。

0
最直接的方法是将两个子精灵添加到代表陷阱门顶部和底部的节点中。这样,您就可以测试碰撞精灵来自哪个方向,并根据需要启用/禁用另一个精灵的动态效果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接