Форум 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=182403)

codedemen 22.07.2012 12:54

подгрузка внешнего swf
 
Приветствую форумчане!

В as3(да и вообще в флеше) я почти полный 0 - никогда не приходилось с ней работать. Сейчас возникла необходимость для небольшого личного проектика создать обертку для подгрузки в нее вешнего swf файла.
Проблема в следующем - когда я подгружаю этот самый внешний файл он почемто растягиается далеко за видимую область - как итог я вижу на сцене не всю флеш, а только ее евый верхний угол. При этом я уже дня 3 бьюсь над тем как изменить размер этой самой флешки, но ничего не получается. Пробовал создать контейнер типа movieclip и грузить swf туда, а в клипе установить scale, но не помогает, так как подгружаемый файл сам по себе тоже лоадер и он грузит все обьекты непосредственно на сцену.

При этом он использует компонент scene для нахождения размеров сцены, но сколько я не писал и не убирал Sequriity.AllowDomain(*) - никаких ошибок флеш не выдает - т.е. то ли он обращается не к той какой то сцене(!?) хотя, насколько я понимаю, она 1 для всех - ведь это то, что указано в html, то ли он к ней не может по каким то причинам обратиться, а ошибок не выдает.

Собственно ваопрос в том - как заставить его грузиться в нормальном размере?

Ниже приведу код своего лоадера и декомпилированные куски того, как и куда добавляется подгружаемый swf:

Мой loader:
Код AS3:

package
{
        import com.demonsters.debugger.MonsterDebugger;
 
        import flash.display.*;
        import flash.display.Sprite;
        import flash.events.*;
        import flash.net.*;
        import flash.system.*;
        import flash.text.TextField;
 
 
        public class Connector extends Sprite
        {               
                private var button:Sprite = new Sprite();
                public var loader:Loader;
                public var container:MovieClip;
                public var request:URLRequest;
                public var Disp:DisplayObjectContainer;
                public var Mov:MovieClip;
                public var config:XML;
 
 
                public function ButtonInteractivity() {
                        drawButton()
                        button.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
                        addChild(button);
 
                }
 
                private function drawButton():void {
                        var textLabel:TextField = new TextField()
                        button.graphics.clear();
                        button.graphics.beginFill(0xD4D4D4); // grey color
                        button.graphics.drawRoundRect(0, 0, 80, 25, 10, 10); // x, y, width, height, ellipseW, ellipseH
                        button.graphics.endFill();
                        textLabel.text = "Click Me!";
                        textLabel.x = 10;
                        textLabel.y = 5;
                        textLabel.selectable = false;
                        button.addChild(textLabel)
                }
 
                private function mouseDownHandler(event:MouseEvent):void {
                        height = 100;
                        width = 100;
                        addChild(loader);
                }
 
                public function Connector()
                {
 
                        if(stage != null) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);       
                }
                public var contentheight:int;
                public var contentwidth:int;
                private function init(e:Event = null):void {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        ButtonInteractivity();
                        MonsterDebugger.initialize(this);
                        MonsterDebugger.trace(this,this.loaderInfo.loaderURL);
                        stage.addEventListener( Event.ENTER_FRAME, this._onUpdate );
                        loader = new Loader();
                        root.scaleX = 0.3;
                        root.scaleY = 0.3;
                        request = new URLRequest("/Loading.swf");       
                        loader.load(request);
                }
 
                private function _onUpdate( e:Event ):void
                {
                        MonsterDebugger.trace(this,"sc");
                        //вообще не помогает - кнопка остается уменьшенной, но объекты, добавленные подгруженным лоадером - нет
                        stage.scaleX = 0.3;
                        stage.scaleY = 0.3;
 
                }
        }
}

Обращение к сцене из init подгружаемой swf
Код AS3:

stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.EXACT_FIT;
            StageReferance.setup(stage);

класс StageReferance
Код AS3:

package com.pickgliss.toplevel
{
    import flash.display.*;
    import flash.events.*;
 
    final public class StageReferance extends Object
    {
        public static var stageHeight:int;
        public static var stageWidth:int;
        private static var _stage:Stage;
 
        public function StageReferance()
        {
            return;
        }// end function
 
        public static function setup(param1:Stage) : void
        {
            if (_stage != null)
            {
                return;
            }
            _stage = param1;
            _stage.addEventListener(Event.EXIT_FRAME, __onNextFrame);
            _stage.addEventListener(Event.RESIZE, __onResize);
            _stage.stageFocusRect = false;
            return;
        }// end function
 
        private static function __onNextFrame(event:Event) : void
        {
            if (_stage.stageWidth > 0)
            {
                _stage.removeEventListener(Event.EXIT_FRAME, __onNextFrame);
                stageWidth = _stage.stageWidth;
                stageHeight = _stage.stageHeight;
            }
            return;
        }// end function
 
        private static function __onResize(event:Event) : void
        {
            stageWidth = _stage.stageWidth;
            stageHeight = _stage.stageHeight;
            return;
        }// end function
 
        public static function get stage() : Stage
        {
            return _stage;
        }// end function
 
    }
}



Буду очень благодарен за помощь! Бьюсь уже 3 дня и ничего пока что не выходит. Спасибо.

caseyryan 22.07.2012 13:59

Цитата:

Собственно ваопрос в том - как заставить его грузиться в нормальном размере?
Заменить вот это:
Код AS3:

 stage.scaleMode = StageScaleMode.EXACT_FIT;

на это:
Код AS3:

stage.scaleMode = StageScaleMode.NO_SCALE;

и перенести этой в init самой обертки

codedemen 22.07.2012 14:09

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

caseyryan 22.07.2012 22:04

Единственное, что могу предположить. Нужно добавить к загруженной флешке слушатель
Код AS3:

Event.ADDED_TO_STAGE

, и, после того как она добавится, подождать еще один кадр, и снова, уже в своей обертке вызвать
Код AS3:

stage.scaleMode = StageScaleMode.NO_SCALE;

Иначе подгруженная флешка так и будет все время менять масштабирование сцены.

codedemen 24.07.2012 18:12

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

от что я заметил - если я в дебагере проверяю размеры сцены, то они почемуто равны 0(что ширина, что высота)... Я так понимаю мне имеет смысл копать именно в этом направлении? Когда создавался проект я создавал проект ActionScript 3 - правильно ли я сделал? и почему при вызове stage.heignt и stage.width мне возвращаются 0? вот как я обращался к сцене:

Код AS3:

stage.align = StageAlign.TOP;
                        stage.scaleMode = StageScaleMode.EXACT_FIT;
                        MonsterDebugger.trace(this, stage.width);//передаю ширину в дебагер - показывает 0
                        MonsterDebugger.trace(this, stage.height);//передаю высоту в дебагер - показывает 0
                        StageReferance = ApplicationDomain.currentDomain.getDefinition("com.pickgliss.toplevel.StageReferance");
                        StageReferance.setup(stage);


при этом в функции обьявления класса я использую:

Код AS3:

public function BBLoader()
                {
                        if (stage)
                        {
                                this.init();
                        }
                        else
                        {
                                addEventListener(Event.ADDED_TO_STAGE, this.init);
                        }
                        return;
                }

Добавлено через 59 минут
Upd
stage.stageweight и stage.stageheight почемуто выдают 500, хотя должны быть 1000 ширина и 600 высота

caseyryan 24.07.2012 20:54

Цитата:

и почему при вызове stage.heignt и stage.width мне возвращаются 0? вот как я обращался к сцене:
В данном случае нужно вызывать:
Код AS3:

stage.stageHeight;
stage.stageWidth;

это вернет видимые габариты сцены. Тогда как stage.width и stage.height возвращают ее ширину с учетом того, что на ней находится. Если в какой-то момент там ничего нет, то вернет нули.

codedemen 24.07.2012 21:14

Ага - это я понял - я там внизу написал маленький upd как раз на эту тему - сцена почему то при trace возвращает мне что ширину что длину для свойств именно stage.stagewidth и stage.stageheight равную 500, хотя должна быть 1000 на 600...

при этом когда инициализируется приложение - то получается, что сцена не меньше, а больше идимой области. т.е. если я ставлю например stage.align = StageAlign.TOP;, то она располагает флешку не по центру видимой области, а правее... как будто какойто марджин или чтото подобное стоит.


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

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