【问题标题】:SpriteKit move node with physics rather than updating positionSpriteKit 使用物理移动节点而不是更新位置
【发布时间】:2017-06-11 16:59:33
【问题描述】:

我的主角通过触摸并按住他然后向左或向右移动手指来移动角色来移动。为此,我只需使用触摸位置的 x 位置更新touchesMoved() 中节点的 x 位置(在平面上左右行走),并根据他移动的方向应用动画。

我想把它提升到一个新的水平并实现相同的效果,但使用物理,这样当我完成移动他并松开我的手指时,他可能会向他移动的方向滑动一点考虑到我移动他的速度,如果这有意义的话。有谁知道我如何实现这个效果?

我是否必须像目前所做的那样在移动时更新位置,同时还要施加力/脉冲?有点困惑如何解决这个问题

【问题讨论】:

  • 您应该只需给节点一个力、冲量或速度就可以了。也不需要更新位置,这实际上可能不会产生预期的结果。

标签: swift sprite-kit


【解决方案1】:

通过力、冲量或速度移动物理体将自动更新玩家位置。

因此,您必须使用正确的方法来实现您的目标。但基于此,我建议将您的 .position 代码替换为您的 touchesMoved 中的 .physicsBody!.velocity 代码。然后,在你的 touchesEnded 中,你可以施加一点冲动,给玩家一点“冰上”的效果,让他们继续前进。

你需要试验你想让角色以正确的速度移动的速度,然后你还需要使用脉冲数字来让它恰到好处。

不过,这可能会有点棘手,在 touchesMoved 中...因为在某些时候您需要将速度重置为 0(因此当您的手指停止时它们会停止移动)。

为此,您需要使用 touch 对象中的 .previousLocation,并比较 X 移动的距离。如果 X 移动的距离 > 0(或某个死区阈值),则应用速度;如果 deltaX 为 0,则将速度设置为 0。

这实际上可能比仅使用.position 移动角色,然后让角色在 touchesEnded 上通过物理滑动一点更复杂。

你必须玩它才能让它正确。

【讨论】:

  • 谢谢你,我会试试这个方法!另外,你知道为什么我在启用isDynamic = true 后启动时会丢失我的角色吗?他应该与他下方的地面接触,并且受重力影响也是错误的。我似乎无法弄清楚他为什么消失了。我在我的问题中添加了一些代码。我也尝试将他限制在地板上方,但这似乎也不起作用。
  • @Brejuro 可能是受影响的ByGravity 命令没有通过。确保您正在使用的 pb 不是 nil。此外,您可以使用简单的print 来查看他要去哪里(上、下等)。不过,您可能应该提出一个新问题,我可以在那里回答如何让他​​保持界限。因为现在这是 1 中的 2 个单独的问题
  • 好的,谢谢。我会把它留在那里,我只是想它可能已经足够简单了,可以发表评论。我会开始着手实现这个!
  • @Brejuro 我有一个 keepPlayerInBounds() 函数,如果您还有其他问题,我可以与您分享。这对于物理实体和平台来说是很常见的事情。它有时会(将)令人沮丧!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 2017-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多