![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Очень простой пример. Рассмотрите пожалуйста.
В событии onLoad устанавливается координата _y = 0; В событии onEnterFrame увеличивается координата на 0.05. Увеличивается... до величины 2.15. После этого операция сложения работать отказывается. Пускалось на восьмерке.
__________________
coming soon... |
|
|||||
|
Регистрация: Aug 2007
Адрес: Москва
Сообщений: 56
|
Так получится)
|
|
|||||
|
Спасибо за ответ, если бы все было так просто
![]() В MovieClip на самом деле растр в настройках которого стоит AllowSmoothing. Смысл в том, что картинка ооооооочень медленно опускается. Ну вот... опускается... до 2.15. А потом перестает. В ходе исследований оказалось что растр ни при чем - дело в коорждинатах объекта MovieClip как такогого. На этом мысль остановилась. Хочется ведь не преодолеть (я и сам нашел решение, прибавлять не 0.05 а 0.051 ), а понять почему так.
__________________
coming soon... |
|
|||||
|
Banned
Регистрация: Dec 2005
Сообщений: 556
|
ну, видать после сложения координата округляется неудачно, и флеш думает, что количество 1/20х не должно инкрементится.
|
|
|||||
|
Регистрация: Aug 2007
Адрес: Москва
Сообщений: 56
|
Дело в дробных координатах. Приведенный мною код для данного исходника заработал. Выкладывать не буду, так как у меня flash cs3.
|
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 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.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;
Последний раз редактировалось iNils; 18.01.2008 в 20:50. |
|
|||||
|
Спасибо за столь развернутый ответ, про твипсы слышал, но face2face както не приходилось столкнуться.
Поизучаю еще сам этот феномен, может еще чтонить откопаю. Но в итоге получается, что задавать смещение на величину меньше твипса (т.е. 0.05) нет смысла в приницпе? т.е. все равно округлится либо до 0 либо до 0.05 ![]() Дополнение: Окраугляет ВСЕГДА в меньшую сторону. Т.е. изменение MovieClipa на величину меньшую 0.05 округлится в 0. Мало того, даже увеличивая именно на 0.05 нельзя быть уверенным... вдруг интерпретатор решит представить 0.05 как 0.049999999999 Поэтому СОЛЮШЕН 1. Хранить координаты MC в отдельной переменной Number чтобы избежать выкрутасов с округлением координат. 2. Так как Number один хрен глючит (как я уже писал 0.05 превращается в унылое непотребство 0.049999999) то мы его заборем с помощью старого трюка с разрядами. var s1mc_x:Number = 0;
onEnterFrame = function()
{
s1mc_x = (s1mc_x * 100 + 5)/100;
s1_mc._x = s1mc_x;
}
![]()
__________________
coming soon... Последний раз редактировалось AlexStukoff; 19.01.2008 в 14:26. |
|
|||||
var a:Number = 2.15
var b:Number = 0.05
var c:Number = a+b
trace(c) >> 2.2
var a:Number = 2.15
var b:Number = 0.00005
onEnterFrame=function(){
a+=b
trace(a)
}
>>
2.15005
2.1501
2.15015
2.1502
2.15025
2.1503
2.15035
2.1504
2.15045
2.1505
2.15055
удачи. |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
|
Цитата:
7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 8 8.1 8.2 8.3 8.4 8.49999999999999 8.59999999999999 8.69999999999999 8.79999999999999 8.89999999999999 8.99999999999999 ![]() |
|
|||||
|
Banned
Регистрация: Oct 2006
Адрес: кагбэ Киеф!!1
Сообщений: 1,473
|
а че так показывает?(
|
![]() |
![]() |
Часовой пояс GMT +4, время: 02:44. |
|
|
« Предыдущая тема | Следующая тема » |
|
|