SpriteKit SKPhysicsBody 像一扇门一样的方向碰撞你只能穿过但不能回来

Posted

技术标签:

【中文标题】SpriteKit SKPhysicsBody 像一扇门一样的方向碰撞你只能穿过但不能回来【英文标题】:SpriteKit SKPhysicsBody collision in one direction like a door you can only go through but not back 【发布时间】:2016-02-12 12:35:17 【问题描述】:

在 SpriteKit SKPhysicsBody 中是否有可能拥有一个可以通过但不能返回的对象。

我们的想法是它们不会在一个方向上发生碰撞,因此您可以穿过而不返回,就像活板门一样。

【问题讨论】:

【参考方案1】:

我不太确定物理方法是否可行,但您应该能够在游戏运行时弄乱物理主体的碰撞位掩码以获得类似的效果。

所以你的门处于打开状态,当它检测到玩家正在触摸它时*,它会更改位掩码,以便玩家与它发生碰撞。这应该允许玩家通过一种方式,但不会回来。

*实际上,让门检测玩家何时不再通过玩家的物理身体接触门,并根据这是活板门还是普通门来测试xy 位置。如果位置离门足够远,改变门的碰撞位掩码,让玩家无法通过。

【讨论】:

【参考方案2】:

解决办法就是改变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),您就可以使平台(门)稳固。

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

在门和物体的接触测试中,您需要检查物体的行进方向(您可以使用速度来获得)。如果对象正朝着门会挡住它们的方向移动,那么您在门 categoryBitMask 上放置一个值(以它与节点碰撞位掩码的方式设置它以创建一个 > 0 的值),否则您需要删除门 categoryBitMask(或以不会和节点碰撞位掩码的方式设置它,使其创建值 0)

【讨论】:

以上是关于SpriteKit SKPhysicsBody 像一扇门一样的方向碰撞你只能穿过但不能回来的主要内容,如果未能解决你的问题,请参考以下文章

SpriteKit 的 SKPhysicsBody 与多边形辅助工具

iOS -- SpriteKit框架之SKPhysicsBody的移动和连接

使用“bodyWithTexture”(SpriteKit)时更改 SKPhysicsBody 的中心点

SpriteKit:SKSpriteNode 包含另一个 SKSpriteNodes 但只有一个 SKPhysicsBody

SpriteKit SKPhysicsBody 破碎碰撞

SpriteKit SKPhysicsBody 像一扇门一样的方向碰撞你只能穿过但不能回来