Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Почему класс приложения может создаваться дважды? (http://www.flasher.ru/forum/showthread.php?t=124341)

ekeeper 27.04.2009 16:31

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

Решил прекрутить прелоадер
Сходил на http://etcs.ru/blog/cs3/export_in_se...ame_flash_cs3/
почитал и сделал как там написано. Тоже все хорошо

То есть я поменял главный класс приложения с Main на Preloader
Прелоадер работает - когда все догружает он создает объект класса Main.

Проблема в том, что если в теле конструктора Main написать trace("Main"); то в аутпуте выведется строка "Main" два раза. И различные глюки в приложении показывают, что объектов типа Main - две штуки.

Весь код проверил раз 10 - сам руками я создают объект этот только в прелоадере.

Неужели fla как-то запомнил что прошлым классом приложения был Main и его переглючило и он теперь создает и его и прелоадер?

Попробовал по другом - создал новый проект - перенес туда кадры и библиотеку - не помогло.

Помогите плз :) проект горит

willis83 27.04.2009 16:36

код в студию

ekeeper 27.04.2009 16:42

Все как тут http://etcs.ru/blog/cs3/export_in_se...ame_flash_cs3/
При этом в куче проектах это использую - нигде такого нет

Preloader.as
Код AS3:

package {
        import flash.display.*;
        import flash.text.*;
        import flash.events.*;
 
        public class Preloader extends MovieClip {
                public static const ENTRY_FRAME:Number = 3;
                public static const DOCUMENT_CLASS:String = 'Main';
 
                private var progressBar:Sprite;
                public static var Application:Preloader;
 
                public function Preloader() {
                        super();
                        stop();
                        Application = this;
 
                        stage.showDefaultContextMenu = false;
                        stage.scaleMode = flash.display.StageScaleMode.NO_SCALE;
                        //stage.align = flash.display.StageAlign.TOP_LEFT;
 
                        progressBar = getChildByName("ProgressBar") as Sprite;
                        progressBar.scaleX = 0;
                        loaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler);
                        loaderInfo.addEventListener(Event.COMPLETE, completeHandler);
                }
 
                private function progressHandler(event:ProgressEvent):void {
                        var loaded:uint = event.bytesLoaded;
                        var total:uint = event.bytesTotal;
                        progressBar.scaleX = loaded/total;
                }
 
                private function completeHandler(event:Event):void {
                        play();
                        addEventListener(Event.ENTER_FRAME, enterFrameHandler);
                }
 
                private function enterFrameHandler(event:Event):void {
                        if (currentFrame >= Preloader.ENTRY_FRAME) {
                                removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
                                stop();
                                main();
                        }
                }
 
                private function main():void {
                        //var programClass:Class = loaderInfo.applicationDomain.getDefinition(Preloader.DOCUMENT_CLASS) as Class;
                        //var program:Sprite = new programClass() as Sprite;
                        var program:Main = new Main();
                        program.name = "Main";
                        stage.addChild(program);
                }
        }
}

Main.as
Код AS3:

package {
        import flash.display.*;
        import flash.events.*;
        public class Main extends Sprite {
 
                public function Main() {
                        super();
                        trace("Main");
              }
        }
}


willis83 27.04.2009 17:28

а функция main в прелоадере сколько раз вызывается. Поставьте в ней трэйс... вот вам и 2 класcа Main

ekeeper 27.04.2009 17:30

Чтобы хоть как-то работало - пришлось ввести счетчик объектов и проверять его в конструкторе класса Main. Жесть.

Добавлено через 54 секунды
Цитата:

Сообщение от willis83 (Сообщение 815864)
а функция main в прелоадере сколько раз вызывается. Поставьте в ней трэйс... вот вам и 2 класcа Main

Ставил трэйс - main вызывается ровно один раз...

Добавлено через 5 минут
Мне кажется это IDE глючит - сейчас был косяк следующего рода

у меня два разных проекта (лежат в разных папках) - но оба Fla называются Game и у каждого из них есть Main.as свой который они используют

Я открыл оба флашника и оба мэина - и компильнул один из проекетов - проект подцепил вместо своего Main.as - мэин другого проекта 0_о и вывалил кучу ошибок.

Перезапустил CS4 - все заработало

etc 27.04.2009 17:47

Вы убили всю работу прелоадера, явно указав класс Main в Preloader. Можно было в таком случае вообще никаких прелоадеров не делать.

ekeeper 27.04.2009 17:55

Вы вот про эти строки?
Код AS3:

                        var program:Main = new Main();
                        program.name = "Main";

Когда я писал так:
Код AS3:

var programClass:Class = loaderInfo.applicationDomain.getDefinition(Preloader.DOCUMENT_CLASS) as Class;
var program:Sprite = new programClass() as Sprite;

эффект был тот же самый :(

etc 27.04.2009 18:02

Значит Main инициализируется в embed-клипе, а этого происходить не должно. Нельзя переходить на кадр с embed-клипом, либо надо сделать два кадра в embed-клипе, остановить его на первом, а на втором разместить все необходимые элементы.


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

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