Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 模拟物理之前的发射粒子_Ios_Swift_Sprite Kit_Skemitternode - Fatal编程技术网

Ios 模拟物理之前的发射粒子

Ios 模拟物理之前的发射粒子,ios,swift,sprite-kit,skemitternode,Ios,Swift,Sprite Kit,Skemitternode,我有一个以我的播放器为中心的SKEmitterNode来留下粒子的轨迹。我的播放器有一个物理身体,它是由物理移动的,而不是手动更新它的位置 我遇到的问题是,当我的播放器的速度增加时,粒子从播放器后面的一个点发射。 我发现之所以会发生这种情况,是因为粒子是在帧循环的“计算动作”部分发射的。我的播放器后来被模拟物理部分感动了 我找到的解决办法是将更新回调中的SKEmitterNode移动到物理计算后播放器所在的位置。这是我使用的代码: particleEmitter.position = CGPoi

我有一个以我的播放器为中心的SKEmitterNode来留下粒子的轨迹。我的播放器有一个物理身体,它是由物理移动的,而不是手动更新它的位置

我遇到的问题是,当我的播放器的速度增加时,粒子从播放器后面的一个点发射。 我发现之所以会发生这种情况,是因为粒子是在帧循环的“计算动作”部分发射的。我的播放器后来被模拟物理部分感动了

我找到的解决办法是将更新回调中的SKEmitterNode移动到物理计算后播放器所在的位置。这是我使用的代码:

particleEmitter.position = CGPointMake(
    player.position.x + player.physicsBody!.velocity.dx * dt,
    player.position.y + player.physicsBody!.velocity.dy * dt
)
更新 起初,我将发射器作为播放器的子节点,然后是我观察到问题的时候。 我还尝试将发射器位置精确地同步到玩家位置,而不考虑自上次更新velocity*dt以来移动的距离,同样的问题

我的问题是,解决这个问题的正确方法是什么

更新2 我已经创建了一个游乐场来演示这个问题。这里我有一个发射器作为玩家的孩子。玩家的速度增加越多,玩家和发射粒子之间的距离就越大。

这是苹果文档中的帧周期

您的代码只估计玩家的下一个位置。它不考虑其他可能影响玩家位置的因素,例如碰撞、力场、线性阻尼等。我建议你将发射器的位置设置在DIDSimultEngic回调中的玩家的位置,或者将发射器作为玩家的孩子添加。

< P>而不是手动在每个帧上重新定位发射器。让SpriteKit为您完成这项工作:使发射器成为玩家精灵的子节点,并且每当玩家移动时,发射器点将保持在相对于玩家的相同位置


如果你走这条路线,你可能会遇到问题,发射的粒子也会以你不希望的方式跟随玩家。您可以通过将发射器设置为包含播放机的节点来解决此问题。

您有什么问题?您是否正在寻找实现的替代方案?在进行了一些测试并看到@0x141E的答案后,我确实发现了我的解决方案中的一些问题。例如,当玩家与另一个物体高速碰撞后完全停止时,一些粒子会在我的玩家停止点之外产生。我确实尝试了你的两个建议。问题是粒子在到达didSimulatePhysics回调时已经生成,因此在该点将位置设置为播放器位置没有帮助。我知道我所做的是对玩家下一个位置的估计,但是从我所看到的来看,这是一个很好的估计。如果玩家移动得太快以至于跑得比它的孩子快,那么你可能超出了精灵套件所能处理的极限。