Sprite 在接近接触点时速度变慢

Posted

技术标签:

【中文标题】Sprite 在接近接触点时速度变慢【英文标题】:Sprite is slowing as it approaches touch point 【发布时间】:2014-03-12 19:43:22 【问题描述】:

我正在使用 SpriteKit,我的精灵在接近接触点时速度变慢。

我希望精灵在屏幕上从初始点移动到触摸点时保持固定速度。

目前,我将持续时间设置为 3.0

在 touchesEnded 事件中,我收集新的触摸点并将值保存到属性中。

在场景更新事件中,我执行了一个

float realMoveDuration = 3.0;
SKAction *actionMove = [SKAction moveTo:self.newPoint duration:realMoveDuration];
[self.player runAction:[SKAction sequence:@[actionMove]]];

所以当玩家精灵开始越来越接近接触点时,运动会减慢,逐渐到达接触点。

这不是我想要的动作,我希望玩家精灵继续以恒定的速度移动到触摸点。

【问题讨论】:

更多上下文和代码,请 你在场景更新中说你运行那个动作。你每帧都运行那个动作吗?如果是这样,那可能是您的问题,因为您每秒要添加 60 次新操作。此外,如果您只有一个操作,则不需要序列。 【参考方案1】:

您应该只在 touchesEnded 事件中运行您的 SKAction。

如果您在更新事件中有该代码,它将每秒启动新的 SKAction 60 次。您只需要在目的地发生变化时运行新的 SKAction。

如果在您到达原始目的地之前目的地发生了变化,您应该从该节点中删除该操作,然后添加一个新的。

此外,不确定您正在做什么的具体细节,但对象移动的速度取决于您指定的距离和到达那里的时间。因此,如果您希望节点以一致的速度移动,无论距离如何,您都需要进行计算以确定为您的 SKAction 设置的正确持续时间。

例如,如果速度代表每秒像素/单位,您可以这样做来计算您的持续时间:

duration = distance / speed;

【讨论】:

【参考方案2】:

如果您使用 SKAction 移动精灵,请使用 timingMode 属性。默认值为SKActionTimingLinear。所以如果你没有改变它,节点应该以恒定的速度移动。

这是可用的Action Timing Modes 的链接。

【讨论】:

是的,我没有修改timingMode属性,所以线性应该仍然有效......也许我把SKAction放在了错误的事件中?但是当我将代码放入 touchesEnded 事件时,我也遇到了同样的问题 您不应该将 SKAction 放在更新方法中。会发生什么:在每次更新(= 每秒 60 次)时,SKAction 被调用并且玩家向新点移动。由于每次距离变小,但realMoveDuration保持3秒,所以速度逐渐降低,移动变慢。

以上是关于Sprite 在接近接触点时速度变慢的主要内容,如果未能解决你的问题,请参考以下文章

Sprite-Kit 为单个接触注册多个碰撞

Swift 3 Sprite 节点接触/碰撞行为不正常

Sprite Kit 检测接触

Sprite Kit 接触检测

基于滑动角度和速度的 cocos 2d 中 Sprite 的最终位置

iOS 7 Sprite Kit 动画速度变化