swift - collisionBitMask 不起作用

标签 swift sprite-kit collision-detection skphysicsbody

我编写了以下代码来检测玩家、墙壁和 npc 之间的碰撞:

struct PhysicsCategories{

    static let player: UInt32 = 0x1 << 1
    static let npc: UInt32 = 0x1 << 2
    static let wall: UInt32 = 0x1 << 3
    static let all: UInt32 = 0xFFFFFFFF

}

这些是播放器的设置:

self.physicsBody!.categoryBitMask = Constants.PhysicsCategories.player
self.physicsBody!.collisionBitMask = Constants.PhysicsCategories.npc | Constants.PhysicsCategories.wall
self.physicsBody!.contactTestBitMask = Constants.PhysicsCategories.npc

这些是墙的设置:

tileNode.physicsBody!.categoryBitMask = Constants.PhysicsCategories.wall
tileNode.physicsBody!.collisionBitMask = Constants.PhysicsCategories.player | Constants.PhysicsCategories.npc

这些是npc的设置:

npc.physicsBody!.categoryBitMask = Constants.PhysicsCategories.npc
npc.physicsBody!.collisionBitMask = Constants.PhysicsCategories.wall | Constants.PhysicsCategories.player | Constants.PhysicsCategories.npc
npc.physicsBody!.contactTestBitMask = Constants.PhysicsCategories.player

我想让 npc 与墙和玩家发生碰撞。玩家应该与 npc 和墙壁发生碰撞。 结果是玩家可以撞到墙和npc,但是npc只能撞到玩家穿墙..

有没有人知道我在这里做错了什么? npc 在场景中随机走动,collisionbitmask 行为是否受此影响?

编辑:如果我将 npc 的动态属性设置为 true,它就可以工作。但我不希望 npc 是动态的,因为我不希望玩家可以将 npc 推开。 为什么它只在 npc 动态时有效?

最佳答案

如果您不希望玩家能够插入 npc,请不要乱用 dynamic 属性,只需关闭 npc 和玩家之间的碰撞即可:

npc.physicsBody!.collisionBitMask &= ~Constants.PhysicsCategories.player

这将在 npc 的 collisionBitMask 中将代表玩家类别的位设置为 0,而不影响 npc 的任何其他碰撞设置。

或者一开始就不要设置它们。变化:

npc.physicsBody!.collisionBitMask = Constants.PhysicsCategories.wall | Constants.PhysicsCategories.player | Constants.PhysicsCategories.npc

npc.physicsBody!.collisionBitMask = Constants.PhysicsCategories.wall | Constants.PhysicsCategories.npc

因此 npc 不再与玩家发生碰撞 - 这意味着如果 2 发生接触,npc 将不受玩家影响并继续移动,完全不受碰撞影响。但是,contactTestbitMask 仍处于设置状态,因此您的代码将收到碰撞通知。

但是,除非您也为玩家做同样的事情,否则玩家会从 NPC 身上弹开:

player.physicsBody!.collisionBitMask &= ~Constants.PhysicsCategories.npc

当你说:

The npc is walking randomly around the scene, is the collisionbitmask behavior affected by this?

你的意思是它只是从东西上弹开并在屏幕上弹跳,还是你的移动代码有问题?如果是前者,那么就按照 Kod 所说的去做,并将 restitution 设置为 0。 来自 https://developer.apple.com/documentation/spritekit/skphysicsbody :

The restitution property determines how much energy a body maintains during a collision—its bounciness.

关于swift - collisionBitMask 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46508468/

相关文章:

ios - 不知道如何将触摸作为单个实体处理

swift - 粒子发射器未显示在图像上(swift spritekit)

Swift/SpriteKit 访问对象的变量 + 删除节点

c# - 边界矩形碰撞 - 球跳过 Racket 的错误一侧

java - LibGDX - 正确使用多边形类

使用 avspeechsynthesizer 快速代码将语音转换为文本

ios - Swift 解析具有可变类型的 JSON

ios - 按下按钮时如何添加谷歌地图标记?

swift - 比较 SpriteKit 纹理

swift - 如何获得对主视图 Controller 的引用?