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

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

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

Регистрация: Jun 2006
Сообщений: 28
Question MovieClip vs Sprite

[BlooDHounD: эта тема была создана из темы Как с помощью loader многократно использовать картинку?]

Код AS3:
import flash.display.MovieClip;
import flash.events.Event;
import flash.display.BitmapData;
 
var imgfon = new Loader();
var mc1:MovieClip = new MovieClip  ;
var mc2:MovieClip = new MovieClip  ;
 
var r = new URLRequest("image.jpg");
imgfon.load(r);
imgfon.contentLoaderInfo.addEventListener(Event.COMPLETE, go);
 
function go(e:Event) {
	var bd:BitmapData = Bitmap(imgfon.content).bitmapData;
	mc1.addChild(new Bitmap(bd,"auto",true));
        mc2.addChild(new Bitmap(bd,"auto",true));
}
 
addChild(mc1);
addChild(mc2);


Последний раз редактировалось iNils; 12.07.2010 в 13:51.
Старый 11.07.2010, 01:16
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

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


Последний раз редактировалось iNils; 12.07.2010 в 13:29.
Старый 11.07.2010, 04:13
aliim вне форума Посмотреть профиль Отправить личное сообщение для aliim Найти все сообщения от aliim
  № 3  
Ответить с цитированием
aliim

Регистрация: Jun 2006
Сообщений: 28
Цитата:
Сообщение от Wolsh Посмотреть сообщение
зачем какие-то мувиклипы, если достаточно спрайта или даже шейпа? Зачем грузить память ненужным функционалом?
это уже автору решать, что ему нужно, спрайт или мувиклип, мне это неведомо
если бы я использовал Шейп, Вы бы спросили, а почему шейп, а если автору нужен дополнительный функционал? лучше клип

пример написан с целью показать, как присоединять копии загрузчика к иерархии экранных объектов, не более того


Последний раз редактировалось iNils; 12.07.2010 в 13:29.
Старый 11.07.2010, 04:52
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 4  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Цитата:
это уже автору решать, что ему нужно, спрайт или мувиклип, мне это неведомо
100% ему нужен Sprite
Цитата:
если бы я использовал Шейп, Вы бы спросили, а почему шейп
У Shape нет метода addChild.
Цитата:
а если автору нужен дополнительный функционал? лучше клип
А какой функционал есть у программно созданного MovieClip?
__________________
(и)Нильс.ru | Плагины для FlashDevelop

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

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

Старый 11.07.2010, 22:28
aliim вне форума Посмотреть профиль Отправить личное сообщение для aliim Найти все сообщения от aliim
  № 6  
Ответить с цитированием
aliim

Регистрация: Jun 2006
Сообщений: 28
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Вот не надо делать вид, что я тупо решил попридираться. Я абсолютно не понимаю, почему для вывода на сцену картинки нужно создавать экземпляр класса МувиКлип, плюс к этому - экземпляр класса Битмап, да еще и клонировать БитмапДату. Не слишком ли много кортежа для одного изображения? По-минимуму нужен только Шейп, залитый методом beginBitmapFill(). Если требуется интерактивность - Спрайт, залитый методом beginBitmapFill(). Если планируются операции по обработке изображения - только тогда может понадобиться Битмап (и то необязательно). И уж точно не понадобится МувиКлип с его временной шкалой и кучей методов для работы с ней. Иначе Вы платите не столько за семечки, сколько за вакуумную упаковку с золотым напылением и полноцветной печатью.
объясняю:
1. Экземпляр класса МувиКлип занимает в памяти примерно на 20 байт больше, чем Спрайт. Создайте тысяч 10 того и другого и сравните System.totalMemory (я сравнивал). Так что рассказы о том, что клип несет на себе огромный тяжелый функционал не соответствуют действительности.
Весь стандартный функционал Спрайтов и МувиКлипов, равно как и описание структуры заложено в плеере, а не в Вашем файле, так что никуда Вы его не притащите, даже если захотите. Если, например, таймлайна у клипа нет, его и в памяти нет, вся Ваша плата за использование МувиКлипа составит порядка указанных 20 байт.
Поскольку выделение памяти сильно зависит от внешних факторов, при запуске одного и того же файла несколько раз подряд Вы легко получите разброс в 5-10 Кб, даже без загрузки изображений, так что столь подчеркиваемой Вами разницы между МувиКлипом и Спрайтом в реальности Вы не заметите.
Теперь - зачем?
На практике Вам придется загружать картинки в МувиКлипы (созданные вручную и не Вами) с таймлайном и фреймами. Мне приходится. Так что мне лично удобнее иметь универсальный код, который всегда работает с клипами и я не задумываюсь о том, есть в клипе, с которым я работаю таймлайн или нет.
Если Вам лично не нравится использовать клипы, используйте спрайты, но рассказывать страшилки про огромный функционал и массивность кода не надо, ибо их нет. Видимых без микроскопа "преимуществ" Спрайтов тоже нет.

2. Битмап и почему он лучше. Опять же, разница при создании Битмапа вместо просто БитмапДаты составляет несколько байт. За это Вы получаете доступ к двум важным параметрам, влияющим на сглаживание картинки, которые Вы можете менять после того, как она была создана. А менять их, опять же на практике, Вам придется, так же как придется менять размер картинки и прочее. Получив к ним доступ, просто залив прямоугольник beginBitmapFill-ом, Вы не сможете.
Гораздо лучше написать с самого начала легко расширяемый код (и пожертвовать парой байт), чем потом столкнуться с проблемой последующего сглаживания и переписывать его, удаляя все Ваши beginBitmapFill-ы и вводя Битмапы. Занимался этим сам, так что другим советую с самого начала Битмап.

3. Клонирование. Я уже написал два примера, один с клонированием, другой без, используйте, какой хотите, так что вопрос не ясен.
Зачем нужно клонирование вообще?
Затем, что когда Вы загружаете несколько картинок с помощью одного лоадера, beginBitmapFill, как впрочем и Битмар, использует ссылку на текущую БитмапДату лоадера. Так что при загрузке следующей картинки, предыдущая само собой перезапишется. На случай, если их все нужно сохранять, используйте клонирование, пример я уже привел.
ну и поиграться, если кому интересно:
Код AS3:
package {
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
 
	import flash.display.Bitmap;
	import flash.display.BitmapData;
 
	import flash.net.URLLoader;
	import flash.display.Loader;
	import flash.net.URLRequest;
 
	import flash.system.System;
	import flash.events.MouseEvent;
	import flash.geom.Matrix;
 
	public class test extends MovieClip {
 
		var imgfon = new Loader  ;
 
		// использовать объект битмап
		var useBitmap:Boolean = true;
 
		// использовать bitmapFill
		//var useBitmap:Boolean = false;
 
		// использовать мувиклипы
		var mc1:MovieClip = new MovieClip  ;
		var mc2:MovieClip = new MovieClip  ;
 
		// использовать спрайты
		// var mc1:Sprite = new Sprite  ;
		// var mc2:Sprite = new Sprite  ;
 
		public function test() {
			var r = new URLRequest("image.jpg");
			imgfon.load(r);
			imgfon.contentLoaderInfo.addEventListener(Event.COMPLETE,go);
 
			addChild(mc1);
			addChild(mc2);
			mc1.addEventListener(MouseEvent.CLICK,mclick);
			mc2.addEventListener(MouseEvent.CLICK,mclick);
 
		}
 
		function go(e:Event) {
 
			var bd:BitmapData = Bitmap(imgfon.content).bitmapData;
 
			if (useBitmap) {
				// вариант с битмапом
				mc1.addChild(new Bitmap(bd,"auto",true));
				mc2.addChild(new Bitmap(bd,"auto",true));
 
			} else {
				// вариант без битмапа
				mc1.graphics.beginBitmapFill(bd,null,false,false);
				mc1.graphics.drawRect(0,0,bd.width, bd.height);
				mc1.graphics.endFill();
				mc2.graphics.beginBitmapFill(bd,null,false,true);
				mc2.graphics.drawRect(0,0,bd.width, bd.height);
				mc2.graphics.endFill();
			}
			// проверка, что оба метода ссылаются на данные загрузчика и копирования не происходит
			// очистка bd удаляет оба изображения
			// bd.dispose();
 
			mc1.height = mc1.height * 250 / mc1.width;
			mc1.width = 250;
			mc2.height = mc2.height * 250 / mc2.width;
			mc2.width = 250;
			mc2.x = 255;
		}
 
		function mclick(e:MouseEvent) {
			if (useBitmap) {
				// 	изменение сглаживания c помощью smoothing, есть еще pixelSnapping
				e.currentTarget.getChildAt(0).smoothing = ! e.currentTarget.getChildAt(0).smoothing;
			}
			text.text = mc1 + " use Bitmap: " + useBitmap + ", memory usage: " + System.totalMemory;
		}
 
	}
 
}


Последний раз редактировалось iNils; 12.07.2010 в 00:03.
Старый 11.07.2010, 23:58
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 7  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Дело, aliim, не в килобайтах и не в том, что происходит в плеере - я сам когда-то делал флэшки как дизайнер, банеры, сайты, и знаю какие в ИДЕ режимы допуска)) - дело в том, что происходит в голове. Ружье - стреляет, мувиклип листает кадры, битмап отображает изменения БитмапДаты "в реальном времени". Если для Вас простота и достаточность - пустой звук, можно и дальше говорить о "расширяемом" коде с программным созданием новых экземпляров МувиКлипа. Я же показал простой и достаточный, исходя из вопроса, пример вывода несколько раз однажды загруженного файла изображения. Речи об изменении, обработке и даже масштабировании картинки автор не вел, и я не пишу ненужные вещи, чтобы не вводить человека в заблуждения о их необходимости для решения его вопроса. Для вывода изображения достаточно Шейпа.

И еще насчет расширяемости. Ваш код для таймлайна, так что думаю Вы это несерьезно. Но вообще, на будущее - это красивое слово не означает, что у Вас есть один файл и Вы всегда должны "расширяться" (о, боже) от него. Немного посидев, можно заиметь целых ТРИ файла, каждый для своих условий, согласно простоте и достаточности, и расширяйтесь от того, что нужно для текущего проекта. На деле же эта красивая универсальность приводит к системам вроде Flexa, где простая форма входа из двух полей и кнопки обойдется Вам в 240 кб. О расширяемости и универсальности следует говорить в случае мало-мальски крупных проектов, а никак не в случае какого-то процесса загрузки картинки.
И не надо страшилок про "вам придется" - за последние полтора-два года не пришлось, Adobe Flash уже не использую, все делаю в ФД, без редактора графики. Ваша личная ситуация отличается - ОК, я понял, ручная анимация, Ваше право, оперируйте МувиКлипами. Но если речь о программировании, я бы, открыв такой "расширяемый" проект через пару месяцев, стал бы чесать голову - зачем тут МувиКлип, и судорожно бы искал, что же я хотел сделать с его таймлайном. Ружье - чтобы стрелять. Может эта мысль слишком проста, чтобы ее понять?
__________________
Reality.getBounds(this);

Старый 12.07.2010, 01:28
aliim вне форума Посмотреть профиль Отправить личное сообщение для aliim Найти все сообщения от aliim
  № 8  
Ответить с цитированием
aliim

Регистрация: Jun 2006
Сообщений: 28
У всех свое определение слова "простой". Если это желание использовать объекты максимально низкого уровня в иерархии, пожалуйста, Ваше право. Я в этом вижу только примитивизм ради примитивизма. Для меня выгоды в этом нет.

Я предлагаю, как вариант, код, который я считаю таким же "простым", как и Ваш, только способный решать гораздо больший круг задач, если потребуется, без больших телодвижений. В этом смысл моего изначального ответа.

Вы здесь пишете комментарии к МувиКлипам, что они "тяжелые" и "масссивные". Это не так, и я Вам подробно написал почему, вот и все.

Если у Вас мувиклип ассоциируется с чем-то "тяжелым" и "массивным", это Ваша субъективная проблема. Ассоциация с ружьем - это тоже замечательно, если это помогает Вам, отдельно взятому программисту, писать код в ФДТ, в котором Вы не будете путаться.

Для меня Мувиклип - это точно такой же Спрайт, ничем не хуже, только с бОльшим набором функций и свойств, которые мне могут потребоваться, так что я более охотно использую Мувиклип, я вижу в этом только плюс.

Мой подход не менее и не более "правильный" чем Ваш, он имеет право на существование и я его рекомендую на этом форуме, исходя из своего опыта.

Насчет таймлайна - я серьезно, Вам может попасться уже сделанный проект, где самым простым решением возникшей проблемы будет встроить загрузку изображения в МувиКлип, на фрейм номер 42.

Насчет расширяемости - тоже. Каждый расширяется от чего и туда, куда ему удобно. Вы, возможно, создадите три файла со Спрайтами, каждый для своих условий, а я, возможно, предпочту иметь один с МувиКлипом, потому что мне это будет проще или быстрее.

Развивать дальше эту тему я не стану, вроде все понятно.

Старый 12.07.2010, 02:41
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 9  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
Цитата:
Сообщение от aliim Посмотреть сообщение
Мой подход не менее и не более "правильный" чем Ваш, он имеет право на существование и я его рекомендую на этом форуме, исходя из своего опыта.
исходя из ваших утверждений, опыта у Вас нет.
Цитата:
Сообщение от aliim Посмотреть сообщение
Экземпляр класса МувиКлип занимает в памяти примерно на 20 байт больше, чем Спрайт. Создайте тысяч 10 того и другого и сравните System.totalMemory (я сравнивал). Так что рассказы о том, что клип несет на себе огромный тяжелый функционал не соответствуют действительности.
зачем проводить такие дурацкие "примерные" тесты, если есть нормальный способ?
Код AS3:
trace( getSize( new MovieClip() ) ); // 452
trace( getSize( new Sprite() ) ); // 420
trace( getSize( new Bitmap() ) ); // 248
trace( getSize( new Shape() ) ); // 248
так мы получили разницу 32 байта.
Цитата:
Сообщение от aliim Посмотреть сообщение
Весь стандартный функционал Спрайтов и МувиКлипов, равно как и описание структуры заложено в плеере, а не в Вашем файле, так что никуда Вы его не притащите, даже если захотите. Если, например, таймлайна у клипа нет, его и в памяти нет, вся Ваша плата за использование МувиКлипа составит порядка указанных 20 байт.
Поскольку выделение памяти сильно зависит от внешних факторов, при запуске одного и того же файла несколько раз подряд Вы легко получите разброс в 5-10 Кб, даже без загрузки изображений, так что столь подчеркиваемой Вами разницы между МувиКлипом и Спрайтом в реальности Вы не заметите.
Теперь - зачем?
а зачем мне вообще создавать мувиклипы, если там нет таймлайнов? зачем шахтёру в шахте телескоп?
Цитата:
Сообщение от aliim Посмотреть сообщение
На практике Вам придется загружать картинки в МувиКлипы (созданные вручную и не Вами) с таймлайном и фреймами. Мне приходится.
сочувствую.
Цитата:
Сообщение от aliim Посмотреть сообщение
Гораздо лучше написать с самого начала легко расширяемый код (и пожертвовать парой байт), чем потом столкнуться с проблемой последующего сглаживания и переписывать его, удаляя все Ваши beginBitmapFill-ы и вводя Битмапы. Занимался этим сам, так что другим советую с самого начала Битмап.
ещё раз сочувствую. видимо с написанием расширяемого кода у Вас всё-таки не просто.
Цитата:
Сообщение от aliim Посмотреть сообщение
Зачем нужно клонирование вообще?
Затем, что когда Вы загружаете несколько картинок с помощью одного лоадера, beginBitmapFill, как впрочем и Битмар, использует ссылку на текущую БитмапДату лоадера. Так что при загрузке следующей картинки, предыдущая само собой перезапишется.
а Вы это проверяли? или просто из "опыта" знаете?

Старый 12.07.2010, 04:31
aliim вне форума Посмотреть профиль Отправить личное сообщение для aliim Найти все сообщения от aliim
  № 10  
Ответить с цитированием
aliim

Регистрация: Jun 2006
Сообщений: 28
Цитата:
Теперь - зачем?
Цитата:
Сообщение от BlooDHounD Посмотреть сообщение
а зачем мне вообще создавать мувиклипы, если там нет таймлайнов? зачем шахтёру в шахте телескоп?
ответ приведен как раз после слов "Теперь - зачем?", начиная со следующей строки, читайте исходный пост


Цитата:
Сообщение от BlooDHounD Посмотреть сообщение
а Вы это проверяли?
проверял. код приведен в примере, читайте исходный пост

Добавлено через 36 минут
Цитата:
Сообщение от BlooDHounD Посмотреть сообщение
зачем проводить такие дурацкие "примерные" тесты, если есть нормальный способ?
Код AS3:
trace( getSize( new MovieClip() ) ); // 452
trace( getSize( new Sprite() ) ); // 420
trace( getSize( new Bitmap() ) ); // 248
trace( getSize( new Shape() ) ); // 248
так мы получили разницу 32 байта
потому, что getSize работает только с дебаггером, а кроме того дает разные результаты.
почему - объяснять не буду, человек Вы опытный, должно быть для Вас очевидно.

вот такие результаты я получаю, запустив следующий файл у себя на машине:

Код AS3:
package {
 
	import flash.sampler.*;
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.display.Bitmap;
	import flash.display.Shape;
 
	public class test11 extends MovieClip {
 
		public function test11() {
 
			trace(getSize(new MovieClip())); // 420
			trace(getSize(new Sprite())); // 400
			trace(getSize(new Bitmap())); // 224
			trace(getSize(new Shape())); // 224
 
		}
 
	}
 
 
}
таким образом мы получаем разницу в 20 байт. Или, как я более точно написал в том посте, который Вы прочли - "порядка 20 байт" в реальной жизни.


Последний раз редактировалось aliim; 12.07.2010 в 05:11.
Создать новую тему Ответ Часовой пояс GMT +4, время: 23:12.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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