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

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

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

Регистрация: Nov 2007
Адрес: UKRAINE
Сообщений: 32
Отправить сообщение для artics с помощью ICQ
Tools Растеризация мувиков

Предыдущая тема: http://www.flasher.ru/forum/showthread.php?t=173810
Оригинальный класс:http://flashgameblogs.ru/blog/actionscript/667.html

Понравился мне тот класс, и я решил его немного усовершенствовать. Юзайте, может кому-нить поможет )) Если кто-то считает что придумываю велосипед, то киньте ссылку на него, буду очень рад)
А еще хотелось бы его как-то усовершенствовать, пишите свои пропозиции.

Ну теперь про класс. Работает как указанный выше, только теперь можно получить изображение любой ширины и высоты, Для этого нужно создать мувик с нужными параметрами, и передать эго функции createBmpFramesFromMC

Код AS3:
var bmpFrms:BmpFrames=new BmpFrames;
var clip:player_fall = new player_fall;
bmpFrms.createBmpFramesFromMC(clip);
Ещо решил добавить функцию для подгонки размера изображений под размеры двойки в каком-то там степени, какгбэ это улутьшает производительность. Также для больших изображений можно указать предел добавляемых значений. Припустим ширина картинки равна 260 пикселей, программа подгонит ее под 512, но для ваших нужд это много, в таком случае следует указать сколько максимально лишних пикселей может добавить функция. Если вы укажете 100, то максимальным числом будет 360 , а так как оно меньше 512, то в результате изменения не будет и размер останется прежний.
Прописывать это число нужно вторым параметром в той же createBmpFramesFromMC

Код AS3:
bmpFrms.createBmpFramesFromMC(clip,11);
Ну и сам класс

Код AS3:
package {
	import flash.display.BitmapData;
	import flash.display.MovieClip;
	import flash.geom.Matrix;
	import flash.geom.Point;
	import flash.geom.Rectangle;
 
 
	public class BmpFrames {
		public var frames : Array;
		public var frameXs : Array;
		public var frameYs : Array;
		public var totalFrames : int;
 
		public var sizeLimit:int;
 
		protected static var scratchBitmapData : BitmapData = null;
		protected static const INDENT_FOR_FILTER : int = 64;
		protected static const INDENT_FOR_FILTER_DOUBLED : int = INDENT_FOR_FILTER * 2;
		protected static var scratchSize : int = 128 + INDENT_FOR_FILTER_DOUBLED;
		protected static const DEST_POINT : Point = new Point(0, 0);
 
		public function BmpFrames() {
			frames = new Array();
			frameXs = new Array();
			frameYs = new Array();
			totalFrames = 0;
		}
 
		public function createBmpFramesFromMC(clipClass : MovieClip, sizeLimit:int=0) : BmpFrames {
			var clip : MovieClip = clipClass;
			var res : BmpFrames = new BmpFrames();
 
			var totalFrames : int = clip.totalFrames;
 
			var frames : Array = res.frames;
			var frameXs : Array = res.frameXs;
			var frameYs : Array = res.frameYs;
 
			var rect : Rectangle;
			var flooredX : int;
			var flooredY : int;
			var mtx : Matrix = new Matrix();
 
			this.sizeLimit = sizeLimit;
 
			for (var i : int = 1; i <= totalFrames; i++) {
				clip.gotoAndStop(i);
				rect = clip.getBounds(clip);
				rect.width *= clip.scaleX;
				rect.height *= clip.scaleY;
				rect.width = Math.ceil(rect.width) + INDENT_FOR_FILTER_DOUBLED;
				rect.height = Math.ceil(rect.height) + INDENT_FOR_FILTER_DOUBLED;
 
				prepareScratch(rect);
 
 
				flooredX = Math.floor(rect.x) - INDENT_FOR_FILTER;
				flooredY = Math.floor(rect.y) - INDENT_FOR_FILTER;
 
				mtx.tx = -flooredX;
				mtx.ty = -flooredY;
				mtx.a = mtx.d = 1;
 
				mtx.scale(clip.scaleX,clip.scaleY);
				scratchBitmapData.draw(clip, mtx);
 
				var trimBounds : Rectangle = scratchBitmapData.getColorBoundsRect(0xFF000000, 0x00000000, false);
				trimBounds.x -= 1;
				trimBounds.y -= 1;
				trimBounds.width += 2;
				trimBounds.height += 2;
 
				correctSize(62);
				//----------Корректировка ширины и высоты
				if(sizeLimit>0){
					trimBounds.height = correctSize(trimBounds.height);
					trimBounds.width = correctSize(trimBounds.width);
				}
 
				var bmpData : BitmapData = new BitmapData(trimBounds.width, trimBounds.height, true, 0);
				bmpData.copyPixels(scratchBitmapData, trimBounds, DEST_POINT);
 
				flooredX += trimBounds.x;
				flooredY += trimBounds.y;
 
				frames.push(bmpData);
				frameXs.push(flooredX*clip.scaleX);
				frameYs.push(flooredY*clip.scaleY);
			}
			res.totalFrames = res.frames.length;
			return res;
		}
 
		private function correctSize(val:int) {
			//----Ищем число (двойку в какой-то степени) которое больше чем заданое значение
			var k:int = int(Math.pow(2, getPow(val)));
			//----Если размер увеличивается больше за допустимые нормы, оставить его прежним
			//----Если нет, то присвоить ему найденое выше значение
			val = (k - val < sizeLimit)?val = k :val=val ;
 
			return val;
		}
 
		private function getPow(val:int):int {
			var i:int = 1;
			var a:int = 2;
			do {
				i++;
				a *= 2;
			}while (
				a < val
			)
			return(i);
		}
 
		public static function disposeScratch() : void {
			scratchBitmapData.dispose();
			scratchBitmapData = null;
		}
 
		protected static function prepareScratch(rect : Rectangle) : void {
			var sizeIncreased : Boolean = false;
			while (rect.width >= scratchSize || rect.height >= scratchSize) {
				scratchSize *= 2;
				sizeIncreased = true;
			}
			if (scratchBitmapData != null && sizeIncreased) {
				disposeScratch();
			}
			if (scratchBitmapData == null) {
				scratchBitmapData = new BitmapData(scratchSize, scratchSize, true, 0);
			} else {
				scratchBitmapData.fillRect(scratchBitmapData.rect, 0);
			}
		}
 
	}
}

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

Теги
кадров , кеширование , растеризация
Опции темы
Опции просмотра

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

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


 


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


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