【问题标题】:volume-based physicsBodies being moved manually not contacting edge-based physicsBody手动移动的基于体积的物理体不接触基于边缘的物理体
【发布时间】:2016-11-17 08:11:44
【问题描述】:

所以在我的 Space Invaders 游戏中,所有碰撞都运行良好,直到我添加了一个由 edgeChainFromPath 创建的物理体,这是一条代表地面的单线(从 2 个点创建的 SKShapeNode)。现在我的入侵者炸弹(通过 SKAction 移动)在落地时会发出通知,但我的入侵者(通过手动更新其位置移动到update())没有。我的飞船导弹(也由 SKAction 移动)在联系入侵者时会发出通知。

问题:如果一个physicsBody被手动移动并与另一个physicsBody接触,didBeginContact不被调用吗? (所有物理交互 - 位掩码、委托等 - 均已正确设置)。我认为答案是“不,不是”,因为这是唯一的解释,并且可以想象 Sprite/Kit 可能如何工作。 IE。当 SK 引擎自己移动一个节点并意识到它的物理体被绘制在另一个物理体之上时,就会发生接触。

编辑 - 刚刚意识到我的场景中有其他物理实体是静止的,并且入侵者确实会与之发生碰撞,所以这不是 SKAction 的事情。不同之处可能是我添加的新节点是属于 SKShapeNode 的基于边缘的主体,而不是 SKSPriteNode 的基于体积的主体,但我可以找到的文档中没有任何内容表明这不应该工作.

新问题:手动移动的基于体积的物体不会与静止的基于边缘的物体发生碰撞吗?

【问题讨论】:

  • 嗨史蒂夫,如果您同时使用 SKAction 和物理交互/碰撞(不推荐),很难帮助您,特别是如果您涉及更新方法但没有代码我不知道所以我可以错了。
  • @AlessandroOrnano - 这不是我想象的那样 - 请参阅我的编辑。我一直在向这段代码添加正文并遵循标准程序 - 分配类别,设置位掩码,向 didBeginContact 添加测试,到目前为止一切都在第一次工作,所以我的底层代码很好。我要将新的基于边缘的主体更改为基于体积的主体,看看是否会有所改变。
  • 您当前的位掩码设置是什么,您是否在开始联系时过滤掉了任何内容?
  • 我所有的位掩码都检出,我的 checkPhysics() 例程告诉我入侵者接触了地面。入侵者与他们进入的其他物理体接触,其他物理体与地面接触。我目前的理论是,这是因为地面是一个非常薄的基于边缘的主体,基于体积的主体直接放置在其上,所以我需要检查一下。
  • 您确定物理交互设置正确吗?

标签: ios swift sprite-kit collision-detection


【解决方案1】:

好吧——我的错。入侵者的物理体有dynamic=false。每个其他精灵都是动态的,所以所有其他的碰撞都在工作。我的新形状是一个基于边缘的身体,它也是 dynamic=false。

进行了一次更改,一切正常。我需要更新我的checkPhysics() 例程来测试这个。

编辑:我真的应该早点看到这个 - checkPhysics() 没有打印入侵者在接触地面时通知的内容,我只是将其归结为稍后会修复的故障。而 checkPhysics() 故意不报告带有dynamic=false 的节点。我认为当我编写该函数时,我假设您会故意设置 dynamic=false 以不参与碰撞/接触检测。我应该更改它以打印警告。

【讨论】:

  • 注意:基于边缘的实体将始终为dynamic: false
  • 确实,但其他与新边缘主体接触的精灵是 dynamic=true。我只需要找出我的入侵者和他们的炸弹之间的区别。
  • SKPhysicsNode 类参考文档似乎没有指出这一点。
  • 边是静态的无体积实体。边缘永远不会被模拟移动,它们的质量无关紧要。边缘用于表示场景中的负空间(例如另一个实体内的空心点)或不可跨越的、不可见的细边界。例如,边缘经常用于表示场景的边界。边缘和体积之间的主要区别在于边缘允许在其自身边界内移动,而体积被认为是实体对象。如果边通过其他方式移动,它们只与体积交互,而不与其他边交互。
  • 这意味着动态 = false
猜你喜欢
  • 1970-01-01
  • 2012-02-27
  • 2014-07-06
  • 2020-09-10
  • 1970-01-01
  • 2017-06-10
  • 2015-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多