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

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

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

Регистрация: Nov 2008
Адрес: Moscow
Сообщений: 493
Отправить сообщение для Dr_Bra с помощью ICQ
По умолчанию програмное сглаживаение растрового изображения

Добрый день, друзья!
Я сделал пример, в котором гружу из библиотеки 2 иконки, к которым прям в библиотеке и применил сглаживание. А третью иконку грузим лоадером, задаем ей параметры сглаживания, но увы ничего не получается. При движении одна иконка по прежнему "трясется" . Кому интересно, выкладываю исходник.
вот такой код:
Код AS3:
package  
{
	import flash.display.Sprite;
	import flash.display.Bitmap;
	import flash.display.Loader;
	import flash.net.URLRequest;
	import flash.events.Event;
 
	public class Main extends Sprite 
	{
		private static const SPEED_X:Number=30;
		private static const SPEED_Y:Number=60;
		private var _w:Number;
		private var _l1xpos:Number;
		private var _layer1;
		private var _stage;
		private var _p2;
		private var _p3;
		private var _sprite:Sprite;
		private var _iconLoader:Loader;
		private var _bitmap:Bitmap;
 
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
 
			_stage = stage;
			_w=_stage.stageWidth;
 
			_layer1=new Full_tree();
			_stage.addChild(_layer1);
			_layer1.x=stage.stageWidth/2;
			_layer1.y=stage.stageHeight;
 
			startMove();// начинаем движение объектов
 
			_sprite=new Sprite();
			_layer1.i1.iIn.addChild(_sprite);
			_iconLoader=new Loader();
			_iconLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, theSmoothing);
			_iconLoader.load(new URLRequest("persons/1/icon.jpg"));
 
			_p2=new P2();
			_layer1.i2.iIn.addChild(_p2);
 
			_p3=new P3();
			_layer1.i3.iIn.addChild(_p3);
		}	
		private function theSmoothing(evt:Event):void
			{
				_bitmap = Bitmap(_iconLoader.content);
				_bitmap.smoothing = true;
				_sprite.addChild(_bitmap);
			}
 
		private function startMove():void
		{
			_stage.addEventListener(Event.ENTER_FRAME, checkMouse);
		}		
		private function checkMouse(evt:Event):void
		{
			_l1xpos = _w/2-(_stage.mouseX-_w/2);
			_layer1.x +=(_l1xpos-_layer1.x)/SPEED_X; 
		}
	}
}
Подскажите, в чем дело?

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

Регистрация: Jul 2010
Сообщений: 110
Интересно. Даже так не работает:
Код AS3:
		private function theSmoothing(evt:Event):void {
			_bitmap = Bitmap(_iconLoader.content);
			var bData:BitmapData = new BitmapData(100,100);
			bData.draw(_bitmap);
			var bitmap:Bitmap = new Bitmap(bData, "never", true);
			_sprite.addChild(bitmap);
			addEventListener(Event.ENTER_FRAME, checkMouse);
		}
Может поможет фильтрами воспользоваться.

Этот smoothing только для изменения размеров годится, но не для анимации.


Последний раз редактировалось hartman; 20.07.2010 в 19:58.
Старый 20.07.2010, 21:31
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 3  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Попробуйте с pixelSnapping = PixelSnapping.NEVER. А вдруг =)
__________________
...вселенская грусть

Старый 20.07.2010, 22:10
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 4  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
вот так правильнее
Код AS3:
		private function theSmoothing(evt:Event):void
		{
			_bitmap = _iconLoader.content as Bitmap;
			_sprite.graphics.beginBitmapFill(_bitmap.bitmapData, null, false, true);
			_sprite.graphics.drawRect(0, 0, _bitmap.width, _bitmap.height);
			_sprite.graphics.endFill();
		}
__________________
trace("Остановите Землю, я сойду!!!");

Старый 21.07.2010, 03:24
hartman вне форума Посмотреть профиль Отправить личное сообщение для hartman Найти все сообщения от hartman
  № 5  
Ответить с цитированием
hartman

Регистрация: Jul 2010
Сообщений: 110
pixelSnapping я пробовал выше: new Bitmap(bData, "never", true);
А вот способ, который предложил Mur4ik, действительно работает. Как и обещано в описании метода beginBitmapFill:
smooth:Boolean (default = false) — If false, upscaled bitmap images are rendered by using a nearest-neighbor algorithm and look pixelated. If true, upscaled bitmap images are rendered by using a bilinear algorithm. Rendering by using the nearest neighbor algorithm is usually faster.
smoothing помогает только при масштабировании битмапа.

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

Регистрация: Nov 2008
Адрес: Moscow
Сообщений: 493
Отправить сообщение для Dr_Bra с помощью ICQ
Спасибо, очень помогли!
Только появилась другая проблема, первые иконки не загружаются, а загружается только самая последняя
Код AS3:
_sprite=new Sprite();
			_layer1.i1.iIn.addChild(_sprite);
			_iconLoader=new Loader();
			_iconLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, theSmoothing);
			_iconLoader.load(new URLRequest("persons/1/icon.jpg"));
 
			_sprite=new Sprite();
			_layer1.i2.iIn.addChild(_sprite);
			_iconLoader=new Loader();
			_iconLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, theSmoothing);
			_iconLoader.load(new URLRequest("persons/2/icon.jpg"));
 
			_sprite=new Sprite();
			_layer1.i3.iIn.addChild(_sprite);
			_iconLoader=new Loader();
			_iconLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, theSmoothing);
			_iconLoader.load(new URLRequest("persons/3/icon.jpg"));
как можно поправить код, что бы загружались все иконки в свои контейнеры?

Добавлено через 41 минуту
неужели на каждую иконку необходимо создавать индивидуальный Loader и Bitmap?
Код AS3:
_sprite=new Sprite();
			_layer1.i1.iIn.addChild(_sprite);
			_iconLoader=new Loader();
			_iconLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, theSmoothing);
			_iconLoader.load(new URLRequest("persons/1/icon.jpg"));
			function theSmoothing(evt:Event):void
			{
				var _bitmap:Bitmap = new Bitmap();
				_bitmap = _iconLoader.content as Bitmap;
				_sprite.graphics.beginBitmapFill(_bitmap.bitmapData, null, false, true);
				_sprite.graphics.drawRect(0, 0, _bitmap.width, _bitmap.height);
				_sprite.graphics.endFill();
			}
 
			var _sprite2=new Sprite();
			_layer1.i2.iIn.addChild(_sprite2);
			var _iconLoader2=new Loader();
			_iconLoader2.contentLoaderInfo.addEventListener(Event.COMPLETE, theSmoothing2);
			_iconLoader2.load(new URLRequest("persons/2/icon.jpg"));
			function theSmoothing2(evt:Event):void
			{
				var _bitmap2:Bitmap = new Bitmap();
				_bitmap2 = _iconLoader2.content as Bitmap;
				_sprite2.graphics.beginBitmapFill(_bitmap2.bitmapData, null, false, true);
				_sprite2.graphics.drawRect(0, 0, _bitmap2.width, _bitmap2.height);
				_sprite2.graphics.endFill();
			}
если иконок будет 150 ) код получится километровый..

Старый 21.07.2010, 13:49
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 7  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
Цитата:
Сообщение от Dr_Bra Посмотреть сообщение
если иконок будет 150 ) код получится километровый..
используйте один Loader и один Bitmap и один обработчик окончания загрузки
Код AS3:
		private function theSmoothing(evt:Event):void
		{
			_bitmap = evt.currentTarget.loader.content as Bitmap;
			_sprite.graphics.beginBitmapFill(_bitmap.bitmapData.clone(), null, false, true);
			_sprite.graphics.drawRect(0, 0, _bitmap.width, _bitmap.height);
			_sprite.graphics.endFill();
 
			_bitmap.bitmapData.dispose();
			_bitmap = null;
		}
__________________
trace("Остановите Землю, я сойду!!!");

Старый 21.07.2010, 14:00
Dr_Bra вне форума Посмотреть профиль Отправить личное сообщение для Dr_Bra Посетить домашнюю страницу Dr_Bra Найти все сообщения от Dr_Bra
  № 8  
Ответить с цитированием
Dr_Bra
 
Аватар для Dr_Bra

Регистрация: Nov 2008
Адрес: Moscow
Сообщений: 493
Отправить сообщение для Dr_Bra с помощью ICQ
тогда подгружается самая последняя картинка

Старый 21.07.2010, 14:38
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 9  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
Цитата:
Сообщение от Dr_Bra Посмотреть сообщение
тогда подгружается самая последняя картинка
Грузите следующую после загрузки предыдущей, т.е. в том же theSmoothing запускайте загрузку следующей иконки. Или создавайте кучу лоадеров и всего одного обработчика theSmoothing последнего варианта для них будет достаточно.
__________________
trace("Остановите Землю, я сойду!!!");

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

Регистрация: Nov 2008
Адрес: Moscow
Сообщений: 493
Отправить сообщение для Dr_Bra с помощью ICQ
а если картинка не загружается с сервера, загружается из библиотеки? Вот например:
Код AS3:
_stars=new Stars();
			_stage.addChild(_stars);
			_stars.x=_w/2;
			_stars.y=300;
			_stars.contentLoaderInfo.addEventListener(Event.COMPLETE, theStars);
			function theStars(evt:Event):void
			{			
				var _bitmapStars:Bitmap=new Bitmap();
				_bitmapStars=_stars.content as Bitmap;
				_stars.graphics.beginBitmapFill(_bitmapStars.bitmapData, null, false, true);
				_stars.graphics.drawRect(0, 0, _bitmapStars.width, _bitmapStars.height);
				_stars.graphics.endFill();
			}
только так ничего не работает (( а я хотел получить такой же эффект "сглаживания", подскажите как быть в таком случае??

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

Теги
параметры , при движении , сглаживание
Опции темы
Опции просмотра

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

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


 


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


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