为啥 SKPhysicsBody -bodyWithEdgeLoopF​​romRect 不对碰撞做出反应?

Posted

技术标签:

【中文标题】为啥 SKPhysicsBody -bodyWithEdgeLoopF​​romRect 不对碰撞做出反应?【英文标题】:Why doesn't SKPhysicsBody -bodyWithEdgeLoopFromRect react to collisions?为什么 SKPhysicsBody -bodyWithEdgeLoopF​​romRect 不对碰撞做出反应? 【发布时间】:2014-07-17 13:31:39 【问题描述】:

我有一堆积木(想想愤怒的小鸟),当弹丸击中它们时,它们会像你预期的那样倒下。但是,这只有在我这样创建physicsBody 时才有效:

self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.size];

但是,如果我这样创建物理体:

CGRect r = CGRectMake(-self.size.width/2, -self.size.height/2, self.size.width, self.size.height);
self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:r];

那么碰撞就在那里,但是方块不受它的影响。射弹会从上面反弹,但根本不会导致方块移动。我的 categoryBitMask 和 collisionBitMask 是正确的 - 它们适用于 -bodyWithRectangleOfSize,但 -bodyWithEdgeLoopF​​romRect 不适用。

这是 SpriteKit 的错误,还是我遗漏了什么?

谢谢,

-布赖恩

【问题讨论】:

【参考方案1】:

看看SKPhysicsBody Class Reference。

您会发现用于创建physicsBodies的各种类方法分为两类,分别是Volume-basedEdge-based物理body。

bodyWithRectangleOfSize: 返回一个基于体积的物理体,而bodyWithEdgeLoopFromRect 返回一个基于边缘的物理体。

在同一篇文档的概述中,两者的区别解释为:

Sprite Kit 支持两种物理体,基于体积的体 和基于边缘的实体。当你创建一个物理体时,它的种类、大小、 和形状由您调用的构造方法确定。 安 基于边缘的物体没有质量或体积,并且不受 系统中的力或冲量。 基于边缘的物体用于 表示物理中的无体积边界或空心空间 模拟。相比之下,基于体积的实体用于表示 有质量和体积的物体。

【讨论】:

某处还有基于边的实体不会与其他基于边的实体产生接触事件的解释。如果不在参考中,则在 SK 编程指南中。 @LearnCocos2D developer.apple.com/documentation/spritekit/skphysicsbody - isDynamic 属性控制基于体积的物体是否受到重力、摩擦、与其他物体碰撞的影响...

以上是关于为啥 SKPhysicsBody -bodyWithEdgeLoopF​​romRect 不对碰撞做出反应?的主要内容,如果未能解决你的问题,请参考以下文章

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

SpriteKit:SKPhysicsBody 溜走

将精灵附加到 SKPhysicsBody

SKSpriteNode 卡在 init(edgeLoopF​​rom:) - SKPhysicsBody

SKPhysicsBody 未与 SKShapeNode 对齐

SKPhysicsBody 不如预期