【问题标题】:Using SKAction moveByX: y: duration: creates inexact location (using SpriteKit)使用 SKAction moveByX: y: duration: 创建不精确的位置(使用 SpriteKit)
【发布时间】:2013-12-02 00:20:28
【问题描述】:

我正在使用 SpriteKit 并致力于在屏幕上移动 SKSpriteNodes 的系统。我在调用移动方法之前设置了两个全局变量:positionAndMovementX 和 positionAndMovementY,我尝试过将它们作为整数和浮点数。在调用移动我的 SKSpriteNode 的方法之前,这两个变量都将设置为 0、80 或 -80。然后我运行:

 if (emptySpace.position.x == yellowBug.position.x + positionAndMovementX && 
 emptySpace.position.y == yellowBug.position.y + positionAndMovementY)
 {
      SKAction *moveLeft = [SKAction moveByX:positionAndMovementX y:positionAndMovementY duration:.1];

      [yellowBug runAction: moveLeft];
 }

不幸的是,这将适用于几个动作,但在 5 左右之后,x 或 y 值将变得不精确并减少或增加 .000015 或其他东西,所以现在不是 200、180,而是 200, 179.999985,我的方程将不再计算。我尝试将位置更改为整数并返回,但由于某种原因,179.999985 更改为 179 而不是 180,所以我尝试如下舍入:

int posX = lroundf(yellowBug.position.x);
int posY = lroundf(yellowBug.position.y);

[yellowBug setPosition:CGPointMake(posX, posY)];

但这似乎又将变量留在了 179.999985... 帮助? (对不起,如果这是一个菜鸟问题,我还是个初学者)

【问题讨论】:

    标签: sprite-kit skaction


    【解决方案1】:

    浮点等式从来都不是精确的,当涉及到数学时,这一点变得越来越重要(这可能会以微小的数量改变数字的精确表示)。

    一般不要使用“==”表示浮点数;编写一个近似相等的函数(选择一些像 0.001 这样的微小值,并查看目标值是否在正负该数量之内)。

    【讨论】:

    • 好的,本来希望避免做这样的事情,但如果这是不可避免的......为什么我的重新分配不坚持,只是出于好奇? **它现在可以工作了:)
    • 由于您要求框架随着时间的推移调整一个值,因此它可能会进行除法(将您的总增量减少一定数量的帧)。并非所有数字都可以用“浮点数”精确表示;除法会产生微小的舍入误差,可能仅在小数点后 12 位左右可见。在这种情况下,在许多帧中,即使是一个微小的错误最终也会在较小的小数位上显示出来。
    【解决方案2】:

    通过简单地将 .5 添加到我的位置然后将其转换为 int,终于找到了我的解决方案(一直在从事其他项目,实际上并没有花这么长时间)。

    所以我把它写成

    if ((int)(yellowBug.position.x + .5) == yada yada)

    它就像一个魅力:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-24
      • 1970-01-01
      • 2014-08-21
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多