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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 03.12.2011, 22:20
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 1  
Ответить с цитированием
orcpochta

Регистрация: Feb 2008
Сообщений: 890
По умолчанию Словил жестокий баг с DisplayObject.scrollRect

Код AS3:
import flash.display.Sprite;
import flash.geom.Rectangle;
import flash.events.MouseEvent;
import flash.events.Event;
 
var s:Sprite = new Sprite();
s.graphics.beginFill(0x123456);
s.graphics.drawRect(0, 0, 100, 100);
addChild(s);
 
var rect:Rectangle = new Rectangle(0, 0, 50, 50);
 
stage.addEventListener(MouseEvent.CLICK, handler_click);
 
function handler_click(event:Event = null):void {
	s.scrollRect = rect;
	trace('handler_click:', s.width, s.height);
	//stage.addEventListener(Event.ENTER_FRAME, handler_enterFrame);
}
 
function handler_enterFrame(event:Event):void {	
	trace('handler_enterFrame:', s.width, s.height);
}
Ширина и высота после накладывания scrollRect-a не сразу принимают правильные значения:

Цитата:
handler_click: 100 100
handler_click: 50 50
Более того, если раскомментировать слушатель ENTER_FRAME-a, то у меня видно, что и в его первом срабатывании размеры еще не приняли истинного значения:

Цитата:
handler_click: 100 100
handler_enterFrame: 100 100
handler_enterFrame: 50 50
Этот глюк стоил мне мощнейшего батхерда уже вторую пару выходных.
__________________
скриптограф

Старый 03.12.2011, 22:39
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 2  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Пичалька. Напиши адобу багрепорт...

Старый 03.12.2011, 23:03
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 3  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Не раз сталкивался с подобными "багами", и, насколько понял своим недопрограммистским умом, тут имеет место последовательность обработки событий в течении "кадра". То есть события интерактивные, мыши и клавиатуры, обрабатываются первыми, а вовсе не ENTER_FRAME. Таким образом, когда Вы совершили клик, его обработчик выполнится ДО того, как будет продиспатчено событие ENTER_FRAME для текущего "кадра". В этом обработчике Вы делаете подписку на ENTER_FRAME, и в результате получаете первое событие в этом же кадре, еще ДО его перерисовки.
У меня совсем недавно была такая же проблема совсем не со scrollRect, а с кошерным и вроде бы безбажным addChild)) При клике на некую кнопочку должен был сохраняться скриншот: делался снимок стейджа в битмапдату, конвертация в PNG и сохранение через файлРеференс. Конвертация заметно притормаживала в фуллскрине, и я решил повесить модальное окошко, затемнение и надпись "обрабатываем..." Естественно, вызов конвертации я "перенес на другой кадр" через ентерфрейм. То есть окошко добавлялось на стейдж, и после этого вешался слушатель на ентерфрейм, в обработчике которого запускался процесс конвертации. Но не тут-то было - окошко появлялось на стейдже только после окончания конвертации, "в следующем кадре". Мистика? Баг? Отнюдь. Потому что событие ENTER_FRAME наступало еще в течении этого же кадра, сразу после выполнения обработчика клика, но ДО начала отрисовки. Таким образом и обработчик этого ентерфрейма начинал выполняться в этом же кадре – то есть запускалась конвертация в PNG, и только потом следовала отрисовка.
__________________
Reality.getBounds(this);

Старый 03.12.2011, 23:13
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 4  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Любопытства ради, может быть поможет EXIT_FRAME?

Старый 03.12.2011, 23:15
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 5  
Ответить с цитированием
orcpochta

Регистрация: Feb 2008
Сообщений: 890
Основная проблема-то не в том, что в этом или не в этом кадре, а в том, что не сразу.
__________________
скриптограф

Старый 03.12.2011, 23:23
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 6  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
может быть поможет EXIT_FRAME?
Пробовал конечно, но увы, НЕТ. Пока оставил "быдлокод" с пересылкой ЧЕРЕЗ кадр, то есть с промежуточным обработчиком ентерфрейма. Будет время на красоту решений, вернусь к этому вопросу.
__________________
Reality.getBounds(this);

Старый 03.12.2011, 23:35
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 7  
Ответить с цитированием
orcpochta

Регистрация: Feb 2008
Сообщений: 890
Тут какая проблема возникает:
У меня есть некая утилитная ф-ия выравнивания, которая принимает в себя объект и какие-то параметры для выравнивания. Получается, что эта ф-ия выдает не тот результат, что ожидается, если объекту, который мы в нее передаем, в этом же кадре (даже не в стеке ф-ий, а вообще в кадре) был назначен скроллРект. Т.е. эта же самая ф-ия с этими же самыми входными данными выдаст совершенно иной результат в следующем кадре. Передавать в нее помимо объекта еще и истинные размеры объекта (или ожидаемые) - глупость, т.к. она сразу перестанет быть утилитной, удобной и внятной.
Остается одно - пользоваться старыми добрыми масками, в таком виде скроллРект слишком опасен.
__________________
скриптограф

Старый 03.12.2011, 23:38
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 8  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
если в обработчик клика воткнуть event.updateAfterEvent(), то в первом же enterFrame уже 'правильные' размеры
проблему не решает канеш, но вроде бы вписывается в логику, что Wolsh описал

Старый 03.12.2011, 23:44
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 9  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Код AS3:
function handler_click(event:MouseEvent = null):void {
	s.scrollRect = rect;
 
	var bd:BitmapData = new BitmapData(1, 1, false);
	bd.draw(s);
	bd.dispose();
 
	trace('handler_click:', s.width, s.height);
}
Норм?

Старый 03.12.2011, 23:45
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 10  
Ответить с цитированием
orcpochta

Регистрация: Feb 2008
Сообщений: 890
На счет кадров Wolsh все правильно написал - не спорю.

Добавлено через 6 минут
Цитата:
Норм?
Прикольно. Через жопу, конечно, но прикольно. Не знал о таком, что перед отрисовкой в битмапу экстренно параметры в норму приводятся. Что там происходит на самом деле?
__________________
скриптограф

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

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

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


 


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


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