2013-11-18 3 views
0

Я использую SpriteKit и работаю над системой перемещения SKSpriteNodes по экрану. У меня есть две глобальные переменные, которые задаются до того, как вызывается метод перемещения: positionAndMovementX и positionAndMovementY, которые я пробовал как целые числа, так и float. Перед вызовом метода, который вызывает мой SKSpriteNode, обе эти переменные будут установлены либо 0, 80, либо -80. Тогда я бегу:Использование SKAction moveByX: y: duration: создает неточное местоположение (используя SpriteKit)

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 или так, либо х, либо значение у будет неточным и уменьшение или увеличение на .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,001, и посмотрите, находится ли целевое значение в пределах плюс-минус этой суммы).

+0

Ok, надеялся избегать делать что-то подобное, но если это неизбежно ... Почему мое переназначение не вышло из любопытства? ** он работает сейчас :) – MadShark

+0

Поскольку вы просите фреймворк корректировать значение с течением времени, он, вероятно, делает разделение (чтобы сократить общую сумму дельта на определенное количество кадров). Не все числа могут быть представлены точно с помощью «float»; разделение может произвести крошечную ошибку округления, которая может быть видна только в 12-м знаке после запятой или около того. В этом случае, во многих кадрах, даже небольшая ошибка, в конечном счете, станет видимой в меньших десятичных знаках. –

0

FINALLY нашел мое решение (работал над другими проектами, на самом деле так долго не занимался), просто добавив 0,5 к моей позиции и THEN, переведя его в int.

поэтому я пишу это как

если ((INT) (yellowBug.position.x + 0,5) == болтовня)

и он работает как шарм :)

Смежные вопросы