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

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

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

Регистрация: Jul 2011
Сообщений: 29
По умолчанию Распыляем клип на частицы

Добрый всем день и с Рождеством Вас!!! Тема для опытных, сразу скажу, что нужна помощь в дописании кода.
Вобщем идея тут такая TextField, делаем нексколько битмапов в том числе и с TextField-а и далее рассыпаем их на частицы. как это выглядет можно посмотреть тут: http://wonderfl.net/c/879Y#_=_
В общем думаю вместо TextField использовать клип из библиотеки. Для этого я его создаю как кслас и потом вызываю var myP: snowy = new snowy(); Также потом его прописываю тут: _textBmp.draw(_text, mtx); только вместо _text пишу myP. В результате пусто(( Пока решил сделать шрифт со своей фигурой вместо клипа которую надо рассыпать - но почему то, когда прописываю _text.embedFonts = true; - все снова проподает.
Прошу посмотрите кто опытным взглядом - в чем тут суть? Создается матрица из пикселей по TextFiedl-у но почему она не воспринимает клип как форму? В общем я только начал читать Колина Мука, по этому остро нуждаюсь в вашей помощи! Спасибо!

Код AS3:
package {
	import flash.display.MovieClip;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.BlendMode;
	import flash.display.PixelSnapping;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.filters.BlurFilter;
	import flash.geom.Matrix;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFormat;
 
	[SWF(width=521, height=507, backgroundColor=0x2, frameRate=25)]
 
	public class Snow extends Sprite {
		private static const WIND_X:Number = -0;
		private static const WIND_Y:Number = 40;
		private static const GRAVITY:Number = 20;
		private static const START_Y:Number = 200;
 
		private var _canvas:BitmapData;
		private var _textBmp:BitmapData;
		private var _glow:BitmapData;
		private var _glowMtx:Matrix;
		private var _snow:Array;
		private var _snow_prepare:Array;
		private var _text:TextField;
		//private var _text2:TextField;
		//private var _log:TextField;
		private var myFormat:TextFormat = new TextFormat( "Untitled-Regular");
 
 
		var tf:TextFormat = new TextFormat( "Untitled-Regular", 148 );
		var myP: snowy = new snowy();
 
 
 
 
		public function Snow() {
 
myFormat.font = myFont.fontName;//"Untitled-Regular";
myFormat.size = 148;
myFormat.color = 0xffffff;
 
myP.x = 110;
myP.y = 110;
			_text = new TextField();
			_text.embedFonts = false;
			_text.defaultTextFormat = myFormat;// new TextFormat('Untitled-Regular', 10, 0xffffff, true); 
			_text.text = "        A";
			_text.autoSize = "left";
			//_text.antiAliasType = AntiAliasType.NORMAL;
 
 
			//this.addChild(_text2);
			_textBmp = new BitmapData(700, 525, false, 0x000000);
			this._canvas = new BitmapData(700, 525, false, 0x000000);
			//this.addChild(new Bitmap(_textBmp));
			this.addChild(new Bitmap(this._canvas));
 
			this._snow = [];
			this._snow_prepare = [];
 
			this._glow = new BitmapData(700 / 4, 525 / 4, false, 0x0); 
			var bm:Bitmap = this.addChild(new Bitmap(this._glow, PixelSnapping.NEVER, true)) as Bitmap; // smoothing 
			bm.scaleX = bm.scaleY = 4; 
			bm.blendMode = BlendMode.ADD; 
			this._glowMtx = new Matrix(0.25, 0, 0, 0.25);
addChild(myP);
			// init _snow_prepare
 
			this.addEventListener(Event.ENTER_FRAME, function(event:Event):void{
				for(var i:int = 0; i < 23; i++){
					if(_snow_prepare.length){
						var index:int = Math.random() * Math.min(30, _snow_prepare.length);
						var particle:SnowParticle = _snow_prepare[index];
						_snow_prepare.splice(index, 1);
						_textBmp.setPixel(particle.x, particle.y, 0x000000); // Color AFTER EFFECT
						_snow.push(particle);
					}
				}
				if(_snow_prepare.length || _snow.length){
					update(null);
				}else{
					init();
				}
			});
 
			init();
		}
 
		public function init():void{
			var mtx:Matrix = new Matrix();
			mtx.ty = START_Y;
			_textBmp.draw(_text, mtx);
 
			var rect:Rectangle = _textBmp.getColorBoundsRect(0, 0, false);
			for(var x:int = rect.left; x <= rect.right; x++){
				for(var y:int = rect.top; y <= rect.bottom; y++){
					var col:uint = _textBmp.getPixel(x, y);
					if(col != 0x000000){
						_snow_prepare.push(new SnowParticle(x, y, col, Math.random(), -Math.random()));
					}
				}
			}
			_snow_prepare.sort(function(a:SnowParticle, b:SnowParticle):int{
				var _a:int = a.x + a.y * 3;
				var _b:int = b.x + b.y * 3;
				return _a > _b ? 1 : _a == _b ? 0 : -1;
			});
		}
 
		// 雪を動かすよーー
		public function update(e:Event):void {
			this._canvas.lock(); // いっぱい setPixel するときは必ず lock しよう
			this._canvas.fillRect(this._canvas.rect, 0x0); // カンバスをクリア
			this._canvas.copyPixels(_textBmp, _textBmp.rect, new Point(0, 0));
			var n:int = this._snow.length;
			var d:Number = 1.0;
			var wind_x:Number = (Math.random() > .4 ? WIND_X : 0) / 1000;
			var wind_y:Number = (GRAVITY + (Math.random() > .6 ? WIND_Y : WIND_Y / 2)) / 1000;
			while (n--) {
				var p:SnowParticle = this._snow[n];
				p.vx += wind_x * p.s;
				p.vy += wind_y * p.s;
				p.vx *= 0.99; 
				p.vy *= 0.99;
				p.x += p.vx; 
				p.y += p.vy;
				this._canvas.setPixel(p.x, p.y, p.c); 
				if (p.y < 0 || p.y > this.stage.stageHeight || p.x > this.stage.stageWidth) { 
					this._snow.splice(n, 1); 
				}
			}
			this._canvas.unlock(); 
			this._glow.draw(this._canvas, this._glowMtx);
		}
	}
}
 
 
class SnowParticle {
 
	public var x:Number;
	public var y:Number;
	public var vx:Number;
	public var vy:Number;
	public var s:Number;
	public var c:int;
 
	public function SnowParticle(x:Number, y:Number, color:uint, vx:Number, vy:Number) {
		this.x = x;
		this.y = y;
		this.vx = vx;
		this.vy = vy;
		this.s = 1;
		this.c = color;
	}
}
Добавлено через 11 минут
как сейчас работает: http://vasilevich.by/preview/Snow.swf

Добавлено через 59 минут
Исходник: http://vasilevich.by/preview/Snow.rar
Не забудьте прописать в Action Script settings -> source path

Старый 26.12.2011, 13:57
avido вне форума Посмотреть профиль Отправить личное сообщение для avido Найти все сообщения от avido
  № 2  
Ответить с цитированием
avido

Регистрация: Jul 2003
Адрес: Belarus
Сообщений: 1
Отправить сообщение для avido с помощью ICQ
Ау - есть кто живой?

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

блогер
Регистрация: Mar 2007
Сообщений: 1,291
Записей в блоге: 5
Отправить сообщение для cleptoman с помощью ICQ
я, например, не вижу где вы свой клип вместо исходного ТФ вставляете..соответственно, сказать где тут ошибка проблематично.
__________________
http://cleptoman.free-lance.ru
achivements: дважды благословлен на воровство. осеяный благодатью

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

Регистрация: Jul 2011
Сообщений: 29
Пробую так:
private var _text:snowy = new snowy();

а snowy это клип в библиотеке

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

В исходнике я оставил TextField, чтобы сходу было видно - как действует этот код.

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

блогер
Регистрация: Mar 2007
Сообщений: 1,291
Записей в блоге: 5
Отправить сообщение для cleptoman с помощью ICQ
оформите это все в обособленный, готовый к применению код и покажите..из ваших фрагментов не очень понятно когда и где вы что меняете.

Добавлено через 1 час 5 минут
что-то типа
Код AS3:
// forked from ayuzak's forked from: Hello Snow!!!
// forked from nitoyon's Hello Snow!!!
// Hellow Snow!!!
// forked from Saqoosha's Snow
package {
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.BlendMode;
    import flash.display.MovieClip;
    import flash.display.PixelSnapping;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.filters.BlurFilter;
    import flash.geom.Matrix;
    import flash.geom.Point;
    import flash.geom.Rectangle;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormat;
 
    [SWF(width=465, height=465, backgroundColor=0x0, frameRate=120)]
 
    public class Main extends Sprite {
        private static const WIND_X:Number = 0;
        private static const WIND_Y:Number = 100;
        private static const GRAVITY:Number = 50;
        private static const START_Y:Number = 200;
 
        private var _canvas:BitmapData;
        private var _textBmp:BitmapData;
        private var _glow:BitmapData;
        private var _glowMtx:Matrix;
        private var _snow:Array;
        private var _snow_prepare:Array;
	private var _myMC:MovieClip;
 
        private var _log:TextField;
 
        public function Main() {
            stage.scaleMode = "noScale";
	_myMC					= new MovieClip(); // тут вместо мувиклипа создаете свой из библиотеки
 
	/* соотв. не нужна графика, которая ниже..это просто для примера*/
	_myMC.graphics.beginFill(0x999999, 1);
	_myMC.graphics.drawRect(0, 0, 65, 65);
	_myMC.graphics.endFill();
 
 
            _textBmp = new BitmapData(465, 465, false, 0x000000);
            this._canvas = new BitmapData(465, 465, false, 0x000000);
            //this.addChild(new Bitmap(_textBmp));
            this.addChild(new Bitmap(this._canvas));
 
            this._snow = [];
            this._snow_prepare = [];
 
            this._glow = new BitmapData(465 / 4, 465 / 4, false, 0x0); // キラキラを描く用のん。カンバスの 4 分の 1 のサイズ
            var bm:Bitmap = this.addChild(new Bitmap(this._glow, PixelSnapping.NEVER, true)) as Bitmap; // smoothing を true にして配置
            bm.scaleX = bm.scaleY = 4; // 4 倍にする。
            bm.blendMode = BlendMode.ADD; // 加算モードで合成
            this._glowMtx = new Matrix(0.25, 0, 0, 0.25);
 
            // init _snow_prepare
 
            this.addEventListener(Event.ENTER_FRAME, function(event:Event):void{
                for(var i:int = 0; i < 50; i++){
                    if(_snow_prepare.length){
                        var index:int = Math.random() * Math.min(30, _snow_prepare.length);
                        var particle:SnowParticle = _snow_prepare[index];
                        _snow_prepare.splice(index, 1);
                        _textBmp.setPixel(particle.x, particle.y, 0x000000);
                        _snow.push(particle);
                    }
                }
                if(_snow_prepare.length || _snow.length){
                    update(null);
                }else{
                    init();
                }
            });
 
            init();
        }
 
        public function init():void{
               var mtx:Matrix = new Matrix();
	       _myMC.x	= START_Y;
		_myMC.y	= START_Y;
               mtx.ty = _myMC.y;
               mtx.tx = _myMC.x;
            _textBmp.draw(_myMC, mtx);
 
            var rect:Rectangle = _myMC.getBounds(this);
 
            for(var x:int = rect.left; x <= rect.right; x++){
                for(var y:int = rect.top; y <= rect.bottom; y++){
                    var col:uint = _textBmp.getPixel(x, y);
                    if(col != 0x000000){
                        _snow_prepare.push(new SnowParticle(x, y, col, Math.random(), -Math.random()));
                    }
                }
            }
            _snow_prepare.sort(function(a:SnowParticle, b:SnowParticle):int{
                var _a:int = a.x + a.y * 3;
                var _b:int = b.x + b.y * 3;
                return _a > _b ? 1 : _a == _b ? 0 : -1;
            });
        }
 
        // 雪を動かすよーー
        public function update(e:Event):void {
            this._canvas.lock(); // いっぱい setPixel するときは必ず lock しよう
            this._canvas.fillRect(this._canvas.rect, 0x0); // カンバスをクリア
            this._canvas.copyPixels(_textBmp, _textBmp.rect, new Point(0, 0));
            var n:int = this._snow.length;
            var d:Number = 1.0;
            var wind_x:Number = (Math.random() > .4 ? WIND_X : 0) / 1000;
            var wind_y:Number = (GRAVITY + (Math.random() > .6 ? WIND_Y : WIND_Y / 2)) / 1000;
            while (n--) {
                var p:SnowParticle = this._snow[n];
                p.vx += wind_x * p.s;
                p.vy += wind_y * p.s;
                p.vx *= 0.99; // 空気抵抗
                p.vy *= 0.99; // y 方向にも
                p.x += p.vx; // 動かす
                p.y += p.vy;
                this._canvas.setPixel(p.x, p.y, p.c); // 雪 1 粒描く
                if (p.y < 0 || p.y > this.stage.stageHeight || p.x > this.stage.stageWidth) { // もし画面外にでちゃったら
                    this._snow.splice(n, 1); // とりのぞく
                }
            }
            this._canvas.unlock(); // lock したやつは必ず unlock
            this._glow.draw(this._canvas, this._glowMtx); // キラキラを描く
        }
    }
}
 
 
class SnowParticle {
 
    public var x:Number;
    public var y:Number;
    public var vx:Number;
    public var vy:Number;
    public var s:Number;
    public var c:int;
 
    public function SnowParticle(x:Number, y:Number, color:uint, vx:Number, vy:Number) {
        this.x = x;
        this.y = y;
        this.vx = vx;
        this.vy = vy;
        this.s = 1;
        this.c = color;
    }
}
__________________
http://cleptoman.free-lance.ru
achivements: дважды благословлен на воровство. осеяный благодатью


Последний раз редактировалось cleptoman; 26.12.2011 в 17:20.
Старый 26.12.2011, 17:50
letsrock85 вне форума Посмотреть профиль Отправить личное сообщение для letsrock85 Найти все сообщения от letsrock85
  № 6  
Ответить с цитированием
letsrock85

Регистрация: Jul 2011
Сообщений: 29
Бог ты МОЙ!!!! Есть же люди на белом свете!! Спасибо огромное - работает!! Я уж думал капец мне сегодня!

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

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

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


 


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


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