如何在 SpriteKit 中设置多个物理体
我的playerSprite 上需要有两个物理体。我需要一个物体具有较小的接触区域,并且仅检测某些物体上的碰撞。我的 PlayerNode 类中的代码是:
let walkingBitMask = PhysicsCategory.Door | PhysicsCategory.Wall | PhysicsCategory.SlideTerminator | PhysicsCategory.Shootable
let contactBitMask = PhysicsCategory.Monster | PhysicsCategory.Door | PhysicsCategory.Item | PhysicsCategory.Slide | PhysicsCategory.Teleport
let mainBody = SKPhysicsBody(rectangleOf: CGSize(width: 40, height: 50))
mainBody.collisionBitMask = walkingBitMask
mainBody.contactTestBitMask = contactBitMask
let pitBody = SKPhysicsBody(rectangleOf: CGSize(width: 8, height: 8))
pitBody.contactTestBitMask = PhysicsCategory.Pit
pitBody.collisionBitMask = 0
self.physicsBody = SKPhysicsBody(bodies: [mainBody,pitBody])
self.physicsBody?.affectedByGravity = false
self.physicsBody?.categoryBitMask = PhysicsCategory.Player
self.name = "player"
self.physicsBody?.allowsRotation = false
Pit 类别是我想要与 pitBody 交互的全部内容。我设置坑精灵的代码是:
sprite.physicsBody=SKPhysicsBody(rectangleOf: CGSize(width: 8, height: 8))
sprite.physicsBody?.affectedByGravity = false
sprite.physicsBody?.isDynamic = false
sprite.name = "pit"
sprite.physicsBody?.allowsRotation = false
sprite.physicsBody?.categoryBitMask = PhysicsCategory.Pit
sprite.physicsBody?.collisionBitMask = 0
我遇到的问题是玩家精灵在遇到坑精灵时停止移动。其他一切都很好。
I need to have two physics bodies on my playerSprite. I need one body to be a smaller contact area and to only detect collisions on certain bodies. My code is inside my PlayerNode class is:
let walkingBitMask = PhysicsCategory.Door | PhysicsCategory.Wall | PhysicsCategory.SlideTerminator | PhysicsCategory.Shootable
let contactBitMask = PhysicsCategory.Monster | PhysicsCategory.Door | PhysicsCategory.Item | PhysicsCategory.Slide | PhysicsCategory.Teleport
let mainBody = SKPhysicsBody(rectangleOf: CGSize(width: 40, height: 50))
mainBody.collisionBitMask = walkingBitMask
mainBody.contactTestBitMask = contactBitMask
let pitBody = SKPhysicsBody(rectangleOf: CGSize(width: 8, height: 8))
pitBody.contactTestBitMask = PhysicsCategory.Pit
pitBody.collisionBitMask = 0
self.physicsBody = SKPhysicsBody(bodies: [mainBody,pitBody])
self.physicsBody?.affectedByGravity = false
self.physicsBody?.categoryBitMask = PhysicsCategory.Player
self.name = "player"
self.physicsBody?.allowsRotation = false
The Pit category is all I want to interact with the pitBody. My code in setting up the Pit sprites is:
sprite.physicsBody=SKPhysicsBody(rectangleOf: CGSize(width: 8, height: 8))
sprite.physicsBody?.affectedByGravity = false
sprite.physicsBody?.isDynamic = false
sprite.name = "pit"
sprite.physicsBody?.allowsRotation = false
sprite.physicsBody?.categoryBitMask = PhysicsCategory.Pit
sprite.physicsBody?.collisionBitMask = 0
The problem I'm running into is that the player sprite stops moving when it encounters a pit sprite. Everything else works fine.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
当您使用
SKPhysicsBody.init(bodies:)< 创建物理体时/code>
,子级的属性将被忽略。根据文档,仅使用子实体的形状。
因此,在
mainBody
和pitBody
上指定的测试位掩码将被忽略,并且作为模拟一部分的玩家的复合主体仅指定categoryBitMask
:这意味着它将与其他物体发生碰撞,因为它是
collisionBitMask
默认值为 0xFFFFFFFF(所有位均已设置)。在玩家主体上配置
collisionBitMask
和contactTestBitMask
。如果您需要使用单独的碰撞,请考虑使用
SKPhysicsJointFixed
将两个物理体融合在一起。When you create a physics body using
SKPhysicsBody.init(bodies:)
, the properties on the children are ignored. Only the shapes of the child bodies are used, according to the docs.So the test bit masks specified on
mainBody
andpitBody
are ignored, and the compound body of the player that is part of the simulation only specifies thecategoryBitMask
:This means it will collide with other bodies, since it's
collisionBitMask
default value is 0xFFFFFFFF (all bits set).Configure the
collisionBitMask
andcontactTestBitMask
on the player body.If you need to use separate collisions, consider using a
SKPhysicsJointFixed
to fuse the two physics bodies together.