Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 18.01.2008, 19:30
AlexStukoff вне форума Посмотреть профиль Отправить личное сообщение для AlexStukoff Посетить домашнюю страницу AlexStukoff Найти все сообщения от AlexStukoff
  № 1  
Ответить с цитированием
AlexStukoff
 
Аватар для AlexStukoff

Регистрация: Dec 2007
Адрес: Stavropol
Сообщений: 65
Отправить сообщение для AlexStukoff с помощью ICQ
По умолчанию Баг, мистика(?) с программным изменением координат MovieClip

Очень простой пример. Рассмотрите пожалуйста.
В событии onLoad устанавливается координата _y = 0;
В событии onEnterFrame увеличивается координата на 0.05.
Увеличивается... до величины 2.15. После этого операция сложения работать отказывается.
Пускалось на восьмерке.

Код:
onEnterFrame = function()
{
	s1_mc._y += 0.05;
	trace(s1_mc._y);
	}
	
onLoad = function()
{
	s1_mc._y = -0.05;
	}
Вложения
Тип файла: rar bag.rar (5.2 Кб, 200 просмотров)
__________________
coming soon...

Старый 18.01.2008, 19:57
__ant вне форума Посмотреть профиль Отправить личное сообщение для __ant Найти все сообщения от __ant
  № 2  
Ответить с цитированием
__ant

Регистрация: Aug 2007
Адрес: Москва
Сообщений: 56
Код:
__y = 0;

onEnterFrame = function()
{
	__y = __y + 0.05
	s1_mc._y = Math.floor(__y);
}
Так получится)

Старый 18.01.2008, 20:25
AlexStukoff вне форума Посмотреть профиль Отправить личное сообщение для AlexStukoff Посетить домашнюю страницу AlexStukoff Найти все сообщения от AlexStukoff
  № 3  
Ответить с цитированием
AlexStukoff
 
Аватар для AlexStukoff

Регистрация: Dec 2007
Адрес: Stavropol
Сообщений: 65
Отправить сообщение для AlexStukoff с помощью ICQ
Спасибо за ответ, если бы все было так просто

В MovieClip на самом деле растр в настройках которого стоит AllowSmoothing. Смысл в том, что картинка ооооооочень медленно опускается.
Ну вот... опускается... до 2.15. А потом перестает.
В ходе исследований оказалось что растр ни при чем - дело в коорждинатах объекта MovieClip как такогого. На этом мысль остановилась.

Хочется ведь не преодолеть (я и сам нашел решение, прибавлять не 0.05 а 0.051 ), а понять почему так.
__________________
coming soon...

Старый 18.01.2008, 20:32
aQuestion вне форума Посмотреть профиль Найти все сообщения от aQuestion
  № 4  
Ответить с цитированием
aQuestion
Banned
 
Аватар для aQuestion

Регистрация: Dec 2005
Сообщений: 556
ну, видать после сложения координата округляется неудачно, и флеш думает, что количество 1/20х не должно инкрементится.

Старый 18.01.2008, 20:33
__ant вне форума Посмотреть профиль Отправить личное сообщение для __ant Найти все сообщения от __ant
  № 5  
Ответить с цитированием
__ant

Регистрация: Aug 2007
Адрес: Москва
Сообщений: 56
Дело в дробных координатах. Приведенный мною код для данного исходника заработал. Выкладывать не буду, так как у меня flash cs3.

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

администратор
Регистрация: 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 и 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.
Старый 19.01.2008, 13:58
AlexStukoff вне форума Посмотреть профиль Отправить личное сообщение для AlexStukoff Посетить домашнюю страницу AlexStukoff Найти все сообщения от AlexStukoff
  № 7  
Ответить с цитированием
AlexStukoff
 
Аватар для AlexStukoff

Регистрация: Dec 2007
Адрес: Stavropol
Сообщений: 65
Отправить сообщение для AlexStukoff с помощью ICQ
Спасибо за столь развернутый ответ, про твипсы слышал, но 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;
}
а еще лучше увеличивать координату на 0.51
__________________
coming soon...


Последний раз редактировалось AlexStukoff; 19.01.2008 в 14:26.
Старый 23.01.2008, 19:23
ulik вне форума Посмотреть профиль Отправить личное сообщение для ulik Посетить домашнюю страницу ulik Найти все сообщения от ulik
  № 8  
Ответить с цитированием
ulik
 
Аватар для ulik

Регистрация: Apr 2007
Адрес: Moscow city
Сообщений: 286
Отправить сообщение для ulik с помощью ICQ
Код:
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
Это к тому, что с математикой все у него в порядке. А проблема на самом деле заключается в setter/getter method'e _x/_y вот там и идет округление, которое дает infinite loop.
удачи.
__________________
Дизайн, как презерватив - каждому жмет по-своему © Я
мое: блог форум

Старый 24.01.2008, 00:19
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 9  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Цитата:
Сообщение от ulik
Это к тому, что с математикой все у него в порядке.
Код:
var a:Number = 7;
for (var i:Number = 0; i < 20; i++) {
	a = a + .1;
	trace (a);
}
Код:
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
Так и должно быть?
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 24.01.2008, 01:14
Mr. Fixit вне форума Посмотреть профиль Найти все сообщения от Mr. Fixit
  № 10  
Ответить с цитированием
Mr. Fixit
Banned

Регистрация: Oct 2006
Адрес: кагбэ Киеф!!1
Сообщений: 1,473
а че так показывает?(

Создать новую тему Ответ Часовой пояс GMT +4, время: 02:44.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 02:44.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.