我正在使用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 ......帮助? (对不起,如果这是一个菜鸟问题,我还是初学者)
答案 0 :(得分:0)
浮点相等性从来都不是精确的,当涉及数学时,这种情况越来越重要(这可能会改变数字的精确表示)。
一般情况下,不要将“==”用于花车;写一个近似相等的函数(选择一些微小的值,如0.001,看看目标值是否在正负量内)。
答案 1 :(得分:0)
最终找到了我的解决方案(一直致力于其他项目,实际上没有这么长时间),只需将.5添加到我的位置,然后将其转换为int。
所以我把它写成
if((int)(yellowBug.position.x + .5)== yada yada)
它就像一个魅力:)