使用SKAction moveByX:y:duration:创建不精确的位置(使用SpriteKit)

时间:2013-11-18 18:11:10

标签: sprite-kit skaction

我正在使用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 ......帮助? (对不起,如果这是一个菜鸟问题,我还是初学者)

2 个答案:

答案 0 :(得分:0)

浮点相等性从来都不是精确的,当涉及数学时,这种情况越来越重要(这可能会改变数字的精确表示)。

一般情况下,不要将“==”用于花车;写一个近似相等的函数(选择一些微小的值,如0.001,看看目标值是否在正负量内)。

答案 1 :(得分:0)

最终找到了我的解决方案(一直致力于其他项目,实际上没有这么长时间),只需将.5添加到我的位置,然后将其转换为int。

所以我把它写成

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

它就像一个魅力:)