Показать сообщение отдельно
Старый 18.01.2008, 20:45
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 6  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
1. Все координаты флеша задаются в твипсах (1/20 пикселя), значит все координаты должны быть кратны 0,05. А _y - это геттер/сеттер, а не прямое обращение к координатам
2. У флеша, как и у многих языков, точность математических вычислений с дробными числами не идеальная.

Изменим код
Код:
onEnterFrame = function () {
	s1_mc._y += 0.05;
	var z:String = " = ";
	if (s1_mc._y > 2.15) {
		z = " > ";
	} else if (s1_mc._y < 2.15) {
		z = " < ";
	}
	trace (s1_mc._y + z + " 2.15 " + " | " + (2.15 - s1_mc._y));
};
s1_mc._y = 1.95;
и получим
Код:
2 <  2.15  | 0.15
2.05 <  2.15  | 0.0999999999999996
2.1 <  2.15  | 0.0499999999999998
2.15 =  2.15  | 0
2.15 =  2.15  | 0
2.15 =  2.15  | 0
...
Как видим, в какой-то момент разница была не кратным 0,05 (строчка 2 и 3), это значит, что _y был равен не 2.05 или 2.1, а чуть-чуть-чуть больше, но на столько, что флеш отбрасывал при выводе. Причина эта в пункте 2.
В какой-то момент ошибка накапливается и флеш округляет значение, чтобы оно было кратным 0,05.
Исходя из трейсов, можно предположить, что при сложении 2.15 + 0.05 результат опять не равен 2.2, а меньше и флеш округляет до 2.15

ps.
Еще один код
Код:
onEnterFrame = function () {
	var y = s1_mc._y + 0.05;
	s1_mc._y = y;
	trace (y + " " + (s1_mc._y - y));
};
s1_mc._y = 2.0;
И трейс к нему
Код:
2.05 4.44089209850063e-16
2.1 0
2.15 0
2.2 -0.0499999999999998
2.2 -0.0499999999999998
2.2 -0.0499999999999998
2.2 -0.0499999999999998
__________________
(и)Нильс.ru | Плагины для FlashDevelop


Последний раз редактировалось iNils; 18.01.2008 в 20:50.