Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Динамическое создание swf-файла (http://www.flasher.ru/forum/showthread.php?t=195376)

Alex Lexcuk 06.04.2013 16:19

Цитата:

Сообщение от Psy (Сообщение 1128482)
Спасибо большое за разъяснения.
У меня следующий вопрос есть.. Когда я компилирую AIR-проект в самом флеше, все нормально. Но когда запускаю саму swf-ку, возникает ошибка VerifyError: Error #1014: Не удалось найти класс flash.filesystem::File.

AIR-проектом не предусмотрено открывание отдельно от AIR swf файлов. AIR это как отдельный плеер, который надо сначала инсталировать, потом инсталировать ваш аир проект и только потом запускать ваш проект.
Цитата:

Сообщение от Psy (Сообщение 1128482)
Можете подсказать, как обойти эту проблему?

Это не проблема это особенность архитектуры AIR.
Цитата:

Сообщение от Psy (Сообщение 1128482)
Добавлено через 50 минут
И еще один вопрос.. Вот из основного редактора я сохраняю данные в XML-файл.
В программе-проигрывателе я встраиваю этот файл, и считываю данные, воспроизвожу ролик. Но обновляется это файлик с проигрывателем, естественно, только после перезапуска в самом флеше. А как можно сделать так, чтобы он брал данные из нового xml ?

Что-бы он брал данные из нового xml, надо эти xml данные загрузить, это можно сделать использовав Loader.

Александр Мостовой 06.04.2013 16:26

Цитата:

Что-бы он брал данные из нового xml, надо эти xml данные загрузить, это можно сделать использовав Loader
Думаю вы имели ввиду URLLoader для случая с хмл

Psy 06.04.2013 16:35

Спасибо большое. С 1м и сам разобрался. Помогла перезагрузка компьютера :D
air файл у меня был, не знаю, в чем проблема была.

А через встраивание XML не получится никак? Мне бы желательно, чтобы был один swf-файл. Или вы имеете в виду сначала загрузить через лоадер, а потом встроить?

Добавлено через 2 часа 18 минут
И еще один вопрос.. В основном плеере я для проверки сделал функцию воспроизведения ролика. Т.е. что-то рисуешь, оно сразу в массив спрайтов сохраняется, которые потом по таймеру воспроизводятся. Такое воспроизведение работает нормально.

В программе-плеере делаю так:
function onTick(e:TimerEvent):void //Действия по тику таймера
{
mySprite.graphics.lineStyle(BrSizeArray[i],ColorArray[i],1);
mySprite.graphics.moveTo(X1[i], Y1[i]);
mySprite.graphics.lineTo(X2[i], Y2[i]);

delete X1[i];
delete X2[i];
delete Y1[i];
delete Y2[i];
i++;

addChild(mySprite);

}

И довольно сильно тормозит воспроизведение. Можете подсказать, что я делаю не так? Параметры таймера ставлю одинаковые и там и там.

Alex Lexcuk 06.04.2013 19:24

Цитата:

И довольно сильно тормозит воспроизведение. Можете подсказать, что я делаю не так? Параметры таймера ставлю одинаковые и там и там.
Воспроизведение тормозит, наверно потому что сильно много образуется векторных линий в mySprite.graphics, надо кешировать graphics в битмапдату например как-то так
Код AS3:

package  
{
        import flash.display.*;
        import flash.events.*;
        import flash.geom.*;
        import flash.utils.*;
 
        /**
        * ...
        * @author Lexcuk
        */

        public class BitiDoc extends Sprite
        {
                public var mySprite:Sprite;
                public var bmd:BitmapData;
                public var bm:Bitmap;
                public var lastMousePos:Point;
                public function BitiDoc()
                {
                        addChild(mySprite = new Sprite());
                        addChild(bm = new Bitmap(bmd = new BitmapData(800, 600,true,0x00000000)));
                        var timer:Timer = new Timer(1);
                        lastMousePos = new Point();
                        timer.start();
                        timer.addEventListener(TimerEvent.TIMER, timerHandler);
                }
 
                public function timerHandler(e:TimerEvent):void {
                        mySprite.graphics.clear();
                        mySprite.graphics.lineStyle(3, 0);
                        mySprite.graphics.moveTo(lastMousePos.x, lastMousePos.y);
                        mySprite.graphics.lineTo(lastMousePos.x = stage.mouseX, lastMousePos.y = stage.mouseY);
 
                        var spRect:Rectangle = mySprite.getBounds(mySprite);
                        var mat:Matrix = new Matrix();
                        mat.translate( -spRect.x, -spRect.y);
                        if (spRect.width > 200) spRect.width = 200;
                        if (spRect.height > 200) spRect.height = 200;
 
                        var b:BitmapData = new BitmapData(spRect.width, spRect.height,true,0x00000000);
                        b.draw(mySprite, mat, null, null, null, true);
                        bmd.copyPixels(b, new Rectangle(0, 0, spRect.width, spRect.height), new Point(spRect.x, spRect.y), null, null, true);
 
                }
 
        }
 
}

Так сколько бы линий не было тормозов не будет, потому что graphics спрайта чистый.

Psy 07.04.2013 14:02

Сделал так, как вы написали, но память все еще забивается. Чем дальше воспроизводится ролик, тем больше памяти съедается. Не могу понять, где именно.
Делал по вашему примеру:

Код AS3:

function onTick(e:TimerEvent):void   //Действия по тику таймера
{
        mySprite.graphics.clear();
        mySprite.graphics.lineStyle(BrSizeArray[i],ColorArray[i],1);
        mySprite.graphics.moveTo(X1[i], Y1[i]);
        mySprite.graphics.lineTo(X2[i], Y2[i]);
        var Rect:Rectangle = mySprite.getBounds(mySprite);
        var mat:Matrix = new Matrix();
        mat.translate( -Rect.x, -Rect.y);
        b = new BitmapData(Rect.width, Rect.height,true,0x00000000);
        b.draw(mySprite, mat, null, null, null, true);
        bmd.copyPixels(b, new Rectangle(0, 0, Rect.width, Rect.height), new Point(Rect.x, Rect.y), null, null, true);
        b.dispose();
        b=null;
        delete X1[i];
        delete X2[i];
        delete Y1[i];
        delete Y2[i];
        i++;
}

Не подскажете, в чем еще проблема?

Alex Lexcuk 07.04.2013 16:02

Цитата:

Сообщение от Psy (Сообщение 1128619)
Сделал так, как вы написали, но память все еще забивается. Чем дальше воспроизводится ролик, тем больше памяти съедается. Не могу понять, где именно.

Попробуйте монстер дебагером найти утечку
http://redefy.net/2012/04/30/monsterdebugger3-02/

Psy 29.04.2013 04:06

Прошу прощения, что поднимаю старую тему. Уезжал - и не было возможности тогда разбираться.
Проблема видимо в том, что образуется слишком много объектов Child, в этой строчке:
addChild(bm = new Bitmap(bmd = new BitmapData(800, 600,true,0x00000000)));

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

Подскажите пожалуйста, как решить данную проблему.

Alex Lexcuk 29.04.2013 11:32

Цитата:

Сообщение от Psy (Сообщение 1131643)
Прошу прощения, что поднимаю старую тему. Уезжал - и не было возможности тогда разбираться.
Проблема видимо в том, что образуется слишком много объектов Child, в этой строчке:
addChild(bm = new Bitmap(bmd = new BitmapData(800, 600,true,0x00000000)));

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

Подскажите пожалуйста, как решить данную проблему.

использовать вместо addChild(bm = new Bitmap(bmd = new BitmapData(800, 600,true,0x00000000)));
Код AS3:

                        bmd.copyPixels(b, new Rectangle(0, 0, spRect.width, spRect.height), new Point(spRect.x, spRect.y), null, null, true);

В предыдущем посте how-to

Psy 14.05.2013 23:24

Цитата:

Сообщение от Alex Lexcuk (Сообщение 1131662)
использовать вместо addChild(bm = new Bitmap(bmd = new BitmapData(800, 600,true,0x00000000)));
Код AS3:

                        bmd.copyPixels(b, new Rectangle(0, 0, spRect.width, spRect.height), new Point(spRect.x, spRect.y), null, null, true);

В предыдущем посте how-to

Спасибо Вам огромное за помощь. Благодаря вашим подсказкам хоть что-то, но получилось. Добавил в функцию onTick строчку while (numChildren>80) removeChildAt(0); и память перегружатся перестала.

Что именно вы имели в этом посту в виду, так и не понял. В основном коде использую
var bitmap:Bitmap=new Bitmap(bmd);
addChild(bitmap);
Получается, что образуется много чайлдов, которых потом и чищу.. А как сделать без этого, так и не разобрался( Но сейчас уже хоть как-то работает

Alex Lexcuk 15.05.2013 12:18

Цитата:

Получается, что образуется много чайлдов, которых потом и чищу.. А как сделать без этого, так и не разобрался( Но сейчас уже хоть как-то работает
Не знаю как объяснить, можете скомпилировать этот приме с бесконечным числом кругов как документ класс
Код AS3:

package  
{
        import flash.display.*;
        import flash.events.*;
        /**
        * ...
        * @author Lexcuk
        */

        public class ManyManyCirclesChild extends Sprite
        {
                private var bmd:BitmapData;
                public function ManyManyCirclesChild()
                {
                        //создаём прозрачную битмап дату
                        bmd = new BitmapData(800, 600, true, 0x00000000);
                        addChild(new Bitmap(bmd));
 
                        addEventListener(Event.ENTER_FRAME, enterFrameHandler);
                }
 
                private function enterFrameHandler(e:Event):void {
                        //делаем кружек, но не добавляем его на сцену, а фотографируем в битмап
                        var sp:Sprite = new Sprite();
                        sp.graphics.lineStyle(10, Math.random()*0xFFFFFF);
                        sp.graphics.drawCircle(Math.random() * 800, Math.random() * 600, 50 + Math.random() * 300);
                        bmd.draw(sp);
                }
 
        }
 
}



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

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