SKAction 在碰撞后迫使节点相互通过

Posted

技术标签:

【中文标题】SKAction 在碰撞后迫使节点相互通过【英文标题】:SKAction forces nodes through each other after collision 【发布时间】:2015-11-20 06:46:44 【问题描述】:

这个问题在某种程度上是discussed here,但我想听听其他人在物理世界中强制节点不可预测地相互通过的经验。

我正在使用 SKAction 来移动一个节点。这个节点需要在场景中匀速滑动,直到到达某个位置。第二个节点通过重力下落,直到它接触到场景框架。

当两个节点发生碰撞时,我会假设下落的节点在重力作用下被抬起。相反,有时,第二个节点会重新定位在第一个节点的另一侧。在 didBeginContact 中正确检测到碰撞。

这似乎取决于 SKAction 的速度。如果我减慢使第一个节点滑动 20% 的 SKAction,碰撞会按预期提升第二个节点。

解决此类行为的最佳方法是什么?

【问题讨论】:

>我正在使用 SKAction 移动一个节点。如何!?向我们展示你是如何做到的。还是您只是在寻找文字解决方案? 我正在使用以下 SKAction 以恒定速度垂直滚动容器节点: SKAction *scrollVerticalAction = [SKAction moveByX:0 y:verticalScroll duration:duration];如果我不能将 SKActions 与物理相结合,我可以更改容器节点速度吗?我的容器节点定义如下: containerNode = [[SKNode alloc] init]; containerNode.name = @"obstaclesContainerNode"; [self addChild: containerNode]; 【参考方案1】:

该链接中几乎解释了所有内容。如果您对物理模拟感兴趣,唯一认可的方法是通过施加力或脉冲或直接改变速度矢量来通过物理移动所有物体。

如果您查看 SpriteKit 中每个帧的处理方式,您会发现:

动作先执行 物理模拟后

因此,如果您手动移动节点,您不会让物理模拟将其移动到它认为合适的位置。您正在将对象与实际的物理模拟不同步。此外,这样一来,节点将被动作和物理引擎共同移动,从而产生意想不到的结果。

接触检测将起作用。但不要混淆术语“接触”和“碰撞”。即使您使用 SKActions 移动身体,也会正确触发联系人。但是,碰撞可能无法正确模拟等。因此,只要您对联系人感兴趣,就可以开始使用。如果对任何类型的物理模拟感兴趣,请使用适当的方式与物理世界进行交互。

【讨论】:

以上是关于SKAction 在碰撞后迫使节点相互通过的主要内容,如果未能解决你的问题,请参考以下文章

如何防止在暂停场景上运行 SKAction(取消暂停后),节点纹理在暂停/取消暂停场景后不改变

如何防止 SKAction 序列在解码后重新启动?

光学知识

多层中的 SpriteKit 物理实体碰撞

Swift多节点访问

Unity中物体碰撞后去掉相互之间的反弹力