如何在 SpriteKit 中设置多个物理体

发布于 2025-01-12 06:44:31 字数 1356 浏览 1 评论 0原文

我的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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

寄离 2025-01-19 06:44:31

当您使用 SKPhysicsBody.init(bodies:)< 创建物理体时/code>子级的属性将被忽略。根据文档,仅使用子实体的形状

因此,在 mainBodypitBody 上指定的测试位掩码将被忽略,并且作为模拟一部分的玩家的复合主体仅指定 categoryBitMask

self.physicsBody?.categoryBitMask = PhysicsCategory.Player

这意味着它将与其他物体发生碰撞,因为它是 collisionBitMask 默认值为 0xFFFFFFFF(所有位均已设置)。

在玩家主体上配置 collisionBitMaskcontactTestBitMask
如果您需要使用单独的碰撞,请考虑使用 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 and pitBody are ignored, and the compound body of the player that is part of the simulation only specifies the categoryBitMask:

self.physicsBody?.categoryBitMask = PhysicsCategory.Player

This means it will collide with other bodies, since it's collisionBitMask default value is 0xFFFFFFFF (all bits set).

Configure the collisionBitMask and contactTestBitMask on the player body.
If you need to use separate collisions, consider using a SKPhysicsJointFixed to fuse the two physics bodies together.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文