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

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

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

Регистрация: Jan 2013
Сообщений: 40
По умолчанию Свойства загруженного в прелоадер объекта

Вечер добрэ.

Вот так, у меня выглядит внешний прелоадер:
Первый кадр:

Код AS3:
import flash.events.*;
import flash.system.Security;
import flash.system.LoaderContext;
 
var ldr:Loader = new Loader();
var url:String = loaderInfo.parameters.path;
Security.allowDomain("*");
Security.loadPolicyFile("crossdomain.xml");
var ldrContext:LoaderContext = new LoaderContext(true);
 
if(url!=null) {
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE,swf_loaded);
ldr.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, swf_error);
ldr.load(new URLRequest(url),ldrContext);
}
 
function swf_error(e:Event):void {
    removeEventListener(Event.COMPLETE,swf_loaded);
}
function swf_loaded(e:Event):void {
    nextFrame();
}
stop();
Второй кадр:
Код AS3:
	ldr.x = (stage.stageWidth - ldr.width)/2;
	ldr.y = (stage.stageHeight - ldr.height)/2;
 
	addChild(ldr);
До недавнего времени всё было хорошо. Но сегодня я заметил, что загружаемые Flash'ки, неправильно позиционируются в окне. Стал копать код. В итоге выяснил следующее. Во втором кадре, мы выясняем ширину и высоту объекта ldr. Вот здесь то и кроется ошибка. Ради эксперимента, создал flash'ку с размером рабочего окна в 550x450 пикселов и поместил на его сцену закрашенный прямоугольник в 150x150 пикселов. Далее загрузил эту flash'ку в свой прелоадер и глянул какое значение ширины и высоты, возвращает объект ldr. И выяснилось, что он показывает не 550x450 пикселов, а 150x150 пикселов. То есть он, берет значение ширины и высоты не рабочей области загруженной flask'ки, а размер находящегося в нём закрашенного прямоугольника.

Вопрос. Как узнать точную ширину и высоту загруженного объекта(его рабочей области)?

Старый 03.07.2013, 23:07
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 2  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Вроде бы Loader.contentLoaderInfo.width и Loader.contentLoaderInfo.height.

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

Регистрация: Jan 2013
Сообщений: 40
Цитата:
Вроде бы Loader.contentLoaderInfo.width и Loader.contentLoaderInfo.height.
Спасибо, отличный вариант.)) Ещё один момент. Как установить новые значения ширины и высоты для рабочей области загруженной flask'ки?

Старый 04.07.2013, 00:35
belv вне форума Посмотреть профиль Отправить личное сообщение для belv Найти все сообщения от belv
  № 4  
Ответить с цитированием
belv
[+1 16.07.13]
[+4 16.07.13]

Регистрация: Oct 2005
Сообщений: 217
Код AS3:
import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.Event;
 
var ldr:Loader = new Loader();
var url:URLRequest = new URLRequest("test1.swf");
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE ,completeListener);
ldr.load(url);
addChild(ldr);
function completeListener(e:Event):void
{
	ldr.content.width = 300; // или e.target.content.width = 300; 
	ldr.content.height = 400;
	trace(ldr.content.width + " пикселей");//300 пикселей
	trace(ldr.content.height + " пикселей");//400 пикселей
}
Но если вы зададите высоту и ширину отличающуюся от значений загружаемого swf , у вас все содержимое этого swf файла тоже изменится в масштабе.

Старый 04.07.2013, 01:08
StasHappy вне форума Посмотреть профиль Отправить личное сообщение для StasHappy Найти все сообщения от StasHappy
  № 5  
Ответить с цитированием
StasHappy

Регистрация: Jan 2013
Сообщений: 40
Цитата:
Код AS3:
ldr.content.width = 300; // или e.target.content.width = 300;
Проделал этот фокус у себя. Итог такой:
Код AS3:
trace(ldr.content.width) // возвращает 150 пикселей
trace(ldr.content.height); // возвращает 150 пикселей
То есть возвращает не 550x450 пикселей(размер рабочей области), а 150х150 пикс.
Следующий вариант хорош, он возвращает то, что как раз и нужно, но он доступен только для чтения:
Код AS3:
trace(ldr.contentLoaderInfo.width);
trace(ldr.contentLoaderInfo.height);
Каким же способом можно установить новые значения ширины/высоты рабочей области загруженной flash'ки?

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

Регистрация: Jan 2013
Сообщений: 126
А не пробовали изменять размер в контейнере? думаю это и есть выход

Старый 04.07.2013, 11:35
belv вне форума Посмотреть профиль Отправить личное сообщение для belv Найти все сообщения от belv
  № 7  
Ответить с цитированием
belv
[+1 16.07.13]
[+4 16.07.13]

Регистрация: Oct 2005
Сообщений: 217
Исходник можете выложить?Двух файлов.

Добавлено через 1 час 39 минут
Попробуйте так
Код AS3:
import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.display.MovieClip;
 
var ldr:Loader = new Loader();
var url:URLRequest = new URLRequest("test1.swf");
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE ,completeListener);
var loadMovieSwf:MovieClip;
ldr.load(url);
function completeListener(e:Event):void
{
	loadMovieSwf = e.target.content;
	loadMovieSwf.addEventListener(Event.ADDED_TO_STAGE, addEvListener);
	addChild(loadMovieSwf);
}
function addEvListener(e:Event):void
{
	loadMovieSwf.removeEventListener(Event.ADDED_TO_STAGE, addEvListener);
	loadMovieSwf.width = 300;
	loadMovieSwf.height = 400;
}

Старый 04.07.2013, 19:22
StasHappy вне форума Посмотреть профиль Отправить личное сообщение для StasHappy Найти все сообщения от StasHappy
  № 8  
Ответить с цитированием
StasHappy

Регистрация: Jan 2013
Сообщений: 40
Цитата:
А не пробовали изменять размер в контейнере? думаю это и есть выход
В каком контейнере? Имелось ввиду в прелоадере?

Цитата:
Код AS3:
import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.display.MovieClip;
 
var ldr:Loader = new Loader();
var url:URLRequest = new URLRequest("test1.swf");
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE ,completeListener);
var loadMovieSwf:MovieClip;
ldr.load(url);
function completeListener(e:Event):void
{
	loadMovieSwf = e.target.content;
	loadMovieSwf.addEventListener(Event.ADDED_TO_STAGE, addEvListener);
	addChild(loadMovieSwf);
}
function addEvListener(e:Event):void
{
	loadMovieSwf.removeEventListener(Event.ADDED_TO_STAGE, addEvListener);
	loadMovieSwf.width = 300;
	loadMovieSwf.height = 400;
}
Попробовал. Ничего не вышло. Я думаю проще будет скинуть полный код.

Первый кадр:
Код AS3:
import flash.events.*;
import flash.system.Security;
import flash.system.LoaderContext;
import flash.display.Loader;
import flash.net.URLRequest;
 
var ldr:Loader = new Loader();
var url:String = loaderInfo.parameters.path;
Security.allowDomain("*");
Security.loadPolicyFile("crossdomain.xml");
var ldrContext:LoaderContext = new LoaderContext(true);
 
if(url==null) { // на это не обращайте внимание. поставил для эксперимента
	ldr.contentLoaderInfo.addEventListener(Event.COMPLETE,swf_loaded);
	ldr.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, swf_error);
	ldr.load(new URLRequest("c:/test1.swf"),ldrContext);
}
 
function swf_error(e:Event):void {
    removeEventListener(Event.COMPLETE,swf_loaded);
}
function swf_loaded(e:Event):void {
    nextFrame();
}
 
stop();
Второй кадр:
Код AS3:
stage.scaleMode = "noBorder";
var delitel = 0;
var movikWidth = ldr.contentLoaderInfo.width;
var movikHeight = ldr.contentLoaderInfo.height;
 
trace(movikWidth);
trace(movikHeight);
trace("-");
trace(ldr.width);
trace(ldr.height);
 
	if(movikWidth >= movikHeight) {
		if(movikWidth/movikHeight >= stage.stageWidth/stage.stageHeight) {
			delitel = stage.stageHeight/movikHeight;
			ldr.width = movikWidth*delitel;
			ldr.height = movikHeight*delitel;
		} else {
			delitel = stage.stageWidth/movikWidth;
			ldr.width = movikWidth*delitel;
			ldr.height = movikHeight*delitel;
		}
	} else {
			delitel = movikWidth/stage.stageWidth;
			ldr.width = movikWidth/delitel;
			ldr.height = movikHeight/delitel;	
	}
 
	ldr.x = (stage.stageWidth - movikWidth)/2;
	ldr.y = (stage.stageHeight - movikHeight)/2;
	addChild(ldr);
Осталось всего лишь изменить ширину и высоту загруженного объекта. То есть, заменить ldr.height и ldr.width чем то другим. Внизу я выложил flask'ку, которую пытаюсь загрузить в прелоадер и подогнать её размер.
Вложения
Тип файла: swf test1.swf (1.4 Кб, 35 просмотров)

Старый 04.07.2013, 19:42
belv вне форума Посмотреть профиль Отправить личное сообщение для belv Найти все сообщения от belv
  № 9  
Ответить с цитированием
belv
[+1 16.07.13]
[+4 16.07.13]

Регистрация: Oct 2005
Сообщений: 217
Поставьте во второй кадр и протестируйте
Код AS3:
stage.scaleMode = "noBorder";
var delitel = 0;
var movikWidth = ldr.contentLoaderInfo.width;
var movikHeight = ldr.contentLoaderInfo.height;
 
trace(movikWidth);
trace(movikHeight);
trace("-");
 
 
	if(movikWidth >= movikHeight) {
		if(movikWidth/movikHeight >= stage.stageWidth/stage.stageHeight) {
			delitel = stage.stageHeight/movikHeight;
			ldr.content.width = movikWidth*delitel;
			ldr.content.height = movikHeight*delitel;
		} else {
			delitel = stage.stageWidth/movikWidth;
			ldr.content.width = movikWidth*delitel;
			ldr.content.height = movikHeight*delitel;
		}
	} else {
			delitel = movikWidth/stage.stageWidth;
			ldr.content.width = movikWidth/delitel;
			ldr.content.height = movikHeight/delitel;	
	}
 
	ldr.x = (stage.stageWidth - movikWidth)/2;
	ldr.y = (stage.stageHeight - movikHeight)/2;
	addChild(ldr);
trace(ldr.width);
trace(ldr.height);
У меня работает .

Старый 04.07.2013, 19:54
StasHappy вне форума Посмотреть профиль Отправить личное сообщение для StasHappy Найти все сообщения от StasHappy
  № 10  
Ответить с цитированием
StasHappy

Регистрация: Jan 2013
Сообщений: 40
belv. По идее работает и у меня. Но зря вы переместили trace() в конец. Попробуйте вставить его обратно и посмотреть, правильные ли размеры возвращаются. И сами убедитесь.

Файл который я скинул test1.swf имеет размер рабочей области 330х250. В его сцене имеется всего лишь один объект(закрашеный синим цветом прямоугольник) размером в 150x150 пикселов. В итоге. Когда мы пытаемся загрузить этот файл в прелоадер выходит следующее:
Код AS3:
trace(ldr.content.width); // показывает 150 вместо 330 пикселов
trace(ldr.content.height); // показывает 150 вместо 250 пикселов
То есть, ldr.content.height и ldr.content.width, определяют не рабочую область загруженной flask'ки, а размер того прямоугольника, который в нём находится(с размером в 150x150).

Вставьте trace(ldr.width) и trace(ldr.height) в то место, где они стоят у меня в коде и посмотрите результат.

Добавлено через 21 минуту
В моём случае, получается так, что ldr.width и ldr.height меняют не размер рабочей области загруженной flash'ки, а тот прямоугольник расположенный в нём.. Вот в чём загвоздка.


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

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

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


 


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


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