在移动 SKSpriteNode 时将 Velocity 添加到 SKPhysicsBody

Posted

技术标签:

【中文标题】在移动 SKSpriteNode 时将 Velocity 添加到 SKPhysicsBody【英文标题】:Add Velocity to SKPhysicsBody while moving it's SKSpriteNode 【发布时间】:2018-03-21 15:19:23 【问题描述】:

现在我正在通过在func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) 期间更改SKSpriteNode 的位置来移动它。

我的问题是,当我移动 SpriteNode 时,SKPhysicsBody 的速度没有改变。因此,当那个SpriteNode 确实与另一个SKSpriteNode 发生碰撞时,第二个SpriteNode 只会被推来推去,而不会像你期望的那样真正反弹。

有没有办法解决这个问题?我已经在考虑手动将速度应用于func didBegin(_ contact: SKPhysicsContact) 上的第二个 SpriteNode,但我对这种解决方案并不满意。

谢谢!

【问题讨论】:

【参考方案1】:

一般来说,在 SpriteKit 中,您应该避免将基于物理的运动与直接运动混为一谈。 基于物理的运动,我的意思是通过施加力/脉冲或直接设置其速度属性来移动节点的物理体。 直接移动,我的意思是直接设置它的位置属性(听起来像你正在做的那样)或使用SKAction,如moveTo:duration:

因此,如果您已经使用物理来移动节点,您应该继续使用物理来移动它,而不是直接改变它的移动。或者,如果您仅使用直接移动来移动节点,然后您想了解其速度(例如您的情况下的速度),您将必须编写自己的计算来确定对象在帧之间移动的距离.这是因为对象的运动不是由物理引擎执行的。

当然,您不必遵循这种做法。但是您可能会遇到类似您遇到的问题。

另外一点是,如果您想检测两个节点是否相互接触——但不相互碰撞——那么可以在物理体上使用直接运动。但在你的情况下,听起来你正在处理碰撞的物体,所以我建议坚持使用一种或另一种方法来保持整洁。

【讨论】:

首先感谢您的评论。因为我希望用户通过触摸直接移动 SpriteNode,所以我认为使用 SKAction 之类的东西在我的情况下没有意义。因此,我认为我会手动转移碰撞速度。 @Maci 我同意,在这种情况下,我也会在游戏中使用基于物理的运动。顺便说一句,如果这是您问题的解决方案,请将其标记为已接受的答案。祝您游戏制作愉快!

以上是关于在移动 SKSpriteNode 时将 Velocity 添加到 SKPhysicsBody的主要内容,如果未能解决你的问题,请参考以下文章

仅当 SKSpriteNode 是 Fruit 类型时才用手指移动 SKSpriteNode(SKSpriteNode 的子类)

SKSpriteNode 不会移动

在屏幕上移动 SKSpriteNode

使用 UIPanGestureRecognizer 连续移动 SKSpriteNode

如何在 Swift 中围绕其起始值上下移动 SKSpriteNode?

在 Xcode 中,单击时如何让 SkSpriteNode 向上移动?