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

джонатан 27.09.2010 19:53

Флеш вылетает при попытке наследоваться от класса документа.
 
Fla файл, класс документа com.flashgangsta.Main:


Код AS3:

package com.flashgangsta {
 
        import flash.display.MovieClip;
        import flash.events.Event;
 
        public class Main extends MovieClip {
 
 
                public var menu:MovieClip;
 
 
                public function Main() {
                        this.addEventListener( Event.ADDED_TO_STAGE, init );
                }
 
                public function init( event:Event ):void {
                        this.removeEventListener( Event.ADDED_TO_STAGE, init );
                        menu = new Menu();
                        this.addChild( menu );
                }
 
        }
 
}

Мувиклип Menu:

Код AS3:

package com.flashgangsta {
 
        import flash.display.MovieClip;
 
        public class Menu extends Main {
 
                public function Menu() {
 
                }
        }
}

при попытке компиляции, флеш зависает и вылетает. В чем же беда?

BlooDHounD 27.09.2010 20:07

а вы у себя рекурсии не видите в коде?

джонатан 27.09.2010 20:14

Честно говоря нет, но кажется начинаю понимать потихонечку. Тыкните пожалуйста пальцем, а-то я пока в AS3 нуб. :( Учусь :)
Нужели при наследовании вызывается конструктор суперкласса?

easy.proger 27.09.2010 20:27

Ну и причем тут "а-то я пока в AS3 нуб" ?

Вот, что у вас происходит

Вы создаете объект, который при добавлении на сцену создаст новый объект и добавит его на сцену, дальше новый объект создаст опять объект и опять его добавит на сцену и т/д

Hidest 27.09.2010 20:29

Конечно вызывается... Вам не наследование от документ класса нужно, а просто menu будет дочерним элементов в списке отображения. Не путайте теплое с мягким :)

джонатан 27.09.2010 20:31

т.е. я правильно понял, что Main создает Menu, который опять вызывает конструктор Main и создает Menu, верно? А как же мне тогда быть? Я просто хочу из Menu вызывать методы Main... Но не хочу ограничиваться только статикой.

Hidest, т.е. из меню я смогу вызывать методы класса Main через parent?

Hidest 27.09.2010 20:34

Ну если хотите, вызывайте (если уверены, что у вас меню будет всегда находится в main, а не переместиться когда-нибудь в какой-нибудь контейнер)... или передавайте ссылку в конструктор, тогда вам будет все равно на все изменения иерархии в дисплей листе.

Код AS3:

package com.flashgangsta {
 
        import flash.display.Sprite;
 
        public class Menu extends Sprite {
 
        private var _target:Main;
 
                public function Menu(menuTarget:Main)
              {
                    _target = menuTarget;
                    _target.doSomething();
                }
        }
}


джонатан 27.09.2010 20:45

по parent не вышло:
E:\!!WORK\!flashgangsta.com\src\..\com\flashgangsta\Menu.as, Line 15 1061: Call to a possibly undefined method test through a reference with static type flash.display:DisplayObjectContainer.

а вот по передаче в конструктор все ок. Спасибо большое всем, сегодня я узнал много нового, а главное полезного! :)

Hidest 27.09.2010 21:15

Так в тесте ошибки все у вас сказано бежевым по серому: нет метода test у экземпляра класса.

(parent as Main).yourMethodInMainClass();

джонатан 20.10.2010 17:45

Возвращаюсь к теме. У меня возникла проблемка с вызовом метода родительского класса через ссылку.

Код AS3:

public class Main extends MovieClip {
        public function Main() {
            sectionsContainer = new Sprite();
            personagesRepository = new PersonagesRepository( this );
            sectionsContainer.addChild( personagesRepository );
            this.addChild(sectionsContainer);
        }
 
        public function showProfile():void {
                trace( "showProfile" );
        }
}

Код AS3:

public class PersonagesRepository extends MovieClip {
 
        public function PersonagesRepository( mainLink:Object ) {
                main = mainLink as Main;
                main.showProfile();
        }
}

Ошибка: 1195: Attempted access of inaccessible method showProfile through a reference with static type com.russianRoulette:Main.

Подскажите пожалуйса как исправить?

Кстати вот так:

Код AS3:

main.showProfile.call();

Ошибки нет!

Bgg 20.10.2010 17:56

Код AS3:

public class PersonagesRepository extends MovieClip {
 
        public function PersonagesRepository( mainLink:Main ) {
                mainLink.showProfile();
        }
}


Vier 20.10.2010 18:12

джонатан, покажи целиком код PersonagesRepository, похоже у тебя main, как статик объявлен. И подозреваю, что (mainLink as Main).showProfile(); должно прокатить.

Кстати, в конструктор принимай сразу mainLink:Main и не приводи классы.

джонатан 20.10.2010 18:47

Bgg: та же ошибка.

Vier:

Код AS3:

package com.russianRoulette {
 
        import flash.display.MovieClip;
        import flash.events.Event;
        import com.flashgangsta.managers.ButtonManager;
        import fl.text.TLFTextField;
        import flash.net.URLLoader;
        import flash.display.Sprite;
        import flash.display.Loader;
        import flash.net.URLRequest;
        import caurina.transitions.Tweener;
        import flash.system.LoaderContext;
        import flash.system.ApplicationDomain;
        import flash.system.SecurityDomain;
        import flash.display.DisplayObject;
        import flash.events.ProgressEvent;
        import com.russianRoulette.Communicator;
 
        public class PersonagesRepository extends MovieClip {
 
                public static const SECTION_SHOP:String = "shop";
                public static const SECTION_REPOSITORY:String = "repository";
                public static const PERSONAGE_MOTION_FRAMES:int = 15;
                public static const PERSONAGE_TRANSITION:String = "easeInOutCubic";
 
                private var main:Main;
                private var currentPersonage:Number = 0;
                private var currentSection:String;
                private var currentId:String;
                private var showcase:MovieClip;
                private var nameLable:TLFTextField;
                private var costLable:TLFTextField;
                private var button:MovieClip;
                private var prevButton:MovieClip;
                private var nextButton:MovieClip;
                private var personage:Sprite;
                private var firstView:Boolean = true;
                private var personageLoader:Loader = new Loader();
                private var title:TLFTextField;
                private var personageGoOutNext:Object;
                private var personageGoOutPrev:Object;
                private var personageGoIn:Object;
                private var confirmation:Confirmation;
                private var blockRect:BlockRect;
                private var messageWindow:Message;
                private var buyingSuccess:Boolean;
 
                private static var personagesData:XML;
 
                public function PersonagesRepository( mainLink:Main, section:String, data:XML ) {
                        this.addEventListener( Event.ADDED_TO_STAGE, init );
                        main = mainLink;
                        currentSection = section;
                        personagesData = data;
                }
 
                private function init( event:Event ):void {
 
                        trace(  "PersonagesRepository init" );
                        this.removeEventListener( Event.ADDED_TO_STAGE, init );
                        this.addEventListener( Event.REMOVED_FROM_STAGE, removed );
 
                        gotoAndStop( currentSection );
 
                        currentPersonage = 0;
                        prevButton = prev_mc;
                        nextButton = next_mc;
                        showcase = showcase_mc;
                        nameLable = showcase.name_txt;
                        button = showcase.button_mc;
                        title = title_txt;
                        if( showcase.cost_txt ) costLable = showcase.cost_txt;
                        personageGoOutNext = {x: -( stage.stageWidth / 2 ), useFrames: true, time: PersonagesRepository.PERSONAGE_MOTION_FRAMES, transition: PersonagesRepository.PERSONAGE_TRANSITION, onComplete: function():void { this.parent.removeChild( this ) } };
                        personageGoOutPrev = {x: stage.stageWidth + ( stage.stageWidth / 2 ), useFrames: true, time: PersonagesRepository.PERSONAGE_MOTION_FRAMES, transition: PersonagesRepository.PERSONAGE_TRANSITION, onComplete: function():void { this.parent.removeChild( this ) } };
                        personageGoIn = {x: Math.round( stage.stageWidth / 2 ), useFrames: true, time: PersonagesRepository.PERSONAGE_MOTION_FRAMES, transition: PersonagesRepository.PERSONAGE_TRANSITION };
 
                        ButtonManager.addButton( prevButton, showPrevPersonage );
                        ButtonManager.addButton( nextButton, showNextPersonage );
                        ButtonManager.addButton( button, buttonClicked );
                        ButtonManager.setButtonEnable( prevButton, false, true );
 
                        showPersonage();
 
                }
 
                public function removed( event:Event ):void {
 
                        trace(  "PersonagesRepository removed" );
                        this.removeEventListener( Event.REMOVED_FROM_STAGE, removed );
 
                        ButtonManager.removeButton( prevButton );
                        ButtonManager.removeButton( nextButton );
                        ButtonManager.removeButton( button );
                        ButtonManager.removeButton( prevButton );
 
                }
 
                private function setLable( name:String, cost:String, id:String ):void {
                        nameLable.text = name;
                        if( costLable ) costLable.text = "Стоимость: " + cost + " серебряных кредитов";
                }
 
                private function showPersonage():void {
                        var personageNode:XML = PersonagesRepository.personagesData.personage[ currentPersonage ];
                        setLable( personageNode.@name, personageNode.@cost, personageNode.@id );
                        loadPersonage();
                }
 
                private function loadPersonage():void {
                        if( personageLoader.contentLoaderInfo.bytesLoaded !== personageLoader.contentLoaderInfo.bytesTotal) {
                                personageLoader.close();
                        }
 
                        personageLoader.contentLoaderInfo.removeEventListener( ProgressEvent.PROGRESS, personageProgress );
                        personageLoader.contentLoaderInfo.removeEventListener( Event.COMPLETE, personageLoaded );
 
                        var request:URLRequest = new URLRequest( PersonagesRepository.personagesData.personage[ currentPersonage ].@url );
                        var top:int = Math.round( title.y + title.height );
                        var bottom:int = showcase.y;
 
                        personage = new Sprite();
 
                        if( firstView  ) {
                                personage.x = Math.round( stage.stageWidth / 2 );
                                firstView = false;
                        }
 
                        personage.y = top + Math.round( ( bottom - top )  / 2 );
 
                        this.addChild( personage );
 
                        personage.addChild( new PersonageRepositoryPreloader() );
                        var preloader:DisplayObject = personage.getChildAt( personage.numChildren - 1 );
                        preloader.x = -Math.round( preloader.width / 2 );
 
                        personageLoader.contentLoaderInfo.addEventListener( ProgressEvent.PROGRESS, personageProgress );
                        personageLoader.contentLoaderInfo.addEventListener( Event.COMPLETE, personageLoaded );
 
                        personageLoader.load( request, new LoaderContext( false, ApplicationDomain.currentDomain, SecurityDomain.currentDomain ) );
 
                }
 
                private function personageProgress( event:ProgressEvent ):void {
                        var preloader = personage.getChildAt( personage.numChildren - 1 );
                        var precent:int = Math.round( event.bytesLoaded / event.bytesTotal * 100 );
                        preloader.lable_txt.text = precent + "%";
                }
 
                private function personageLoaded( event:Event ):void {
                        personage.removeChild( personage.getChildAt( personage.numChildren - 1 ) );
                        event.target.content.x = -Math.round( event.target.content.width / 2 );
                        event.target.content.y = -Math.round( event.target.content.height / 2 );
                        personage.addChild( event.target.content );
                        event.target.removeEventListener( ProgressEvent.PROGRESS, personageProgress );
                        event.target.removeEventListener( Event.COMPLETE, personageLoaded );
                }
 
                private function showPrevPersonage( target:MovieClip ):void {
 
                        Tweener.addTween( personage, personageGoOutPrev );
 
                        currentPersonage--;
                        showPersonage();
 
                        personage.x = -( stage.stageWidth / 2 );
                        Tweener.addTween( personage, personageGoIn );
 
                        if( currentPersonage === PersonagesRepository.personagesData.personage.length() - 2 ) {
                                ButtonManager.setButtonEnable( nextButton, true, true );
                        }
 
                        if( currentPersonage === 0 ) {
                                ButtonManager.setButtonState( prevButton, ButtonManager.STATE_OUT );
                                ButtonManager.setButtonEnable( prevButton, false, true );
                        }
                }
 
                private function showNextPersonage( target:MovieClip ):void {
 
                        Tweener.addTween( personage, personageGoOutNext );
 
                        currentPersonage++;
                        showPersonage();
 
                        personage.x = stage.stageWidth + ( stage.stageWidth / 2 );
                        Tweener.addTween( personage, personageGoIn );
 
                        if( currentPersonage === 1 ) {
                                ButtonManager.setButtonEnable( prevButton, true, true );
                        }
 
                        if( currentPersonage === PersonagesRepository.personagesData.personage.length() - 1 ) {
                                ButtonManager.setButtonState( nextButton, ButtonManager.STATE_OUT );
                                ButtonManager.setButtonEnable( nextButton, false, true );
                        }
                }
 
                private function buttonClicked( target:MovieClip ):void {
                        var currentPersonageInfo:XML = PersonagesRepository.personagesData.personage[ currentPersonage ];
                        var message:String;
                        currentId = currentPersonageInfo.@id;
 
                        if( currentSection === PersonagesRepository.SECTION_SHOP ) {
                                message = "Вы уверены что хотите купить " + currentPersonageInfo.@name + " за " + currentPersonageInfo.@cost + " серебряных кредитов?"
                                blockRect = new BlockRect();
                                confirmation = new Confirmation( message, buy, abort );
                                main.addChild( blockRect );
                                main.addChild( confirmation );
                        }
 
                }
 
                private function buy():void {
                        main.communicator.buyPersonage( currentId, onBuyed, VkErrors.buyPersonageError ); //Отправляем запрос на покупку персонажа
                        confirmation.setLable( "Подождите..." );
                }
 
                private function abort():void {
                        removeConfirmation();
                        removeBlockRect();
                }
 
                private function removeConfirmation():void {
                        main.removeChild( confirmation );
                        confirmation = null;
                }
 
                private function removeBlockRect():void {
                        main.removeChild( blockRect );
                        blockRect = null;
                }
 
                private function onBuyed( response:XML ):void {
                        buyingSuccess = response.success != 0; //Запоминаем результат сделки
                        trace( buyingSuccess );
 
                        removeConfirmation();
 
                        messageWindow = new Message( response.message, messageClose ); //Выводим окно с результатом сделки
                        main.addChild( messageWindow );
                }
 
                private function messageClose():void {
                        main.removeChild( messageWindow );
                        messageWindow = null;
                        removeBlockRect();
 
                        if( buyingSuccess ) { //Если персонаж был куплен то идём к профайлу.
                                this.parent.removeChild( this );
                                main.showProfile.call();
                        }
 
                }
 
        }
 
}

main.showProfile() самая последняя строчка

Hidest 20.10.2010 20:07

Что-то у вас все же не так... ибо вот так в чистом виде работает:

Код AS3:

Main.as
 
package 
{
        import flash.display.MovieClip;
 
        public class Main extends MovieClip
        {
 
                public function Main()
                {
                        var menu:Menu = new Menu(this);
                }
 
                public function showProfile():void
                {
                        trace("showProfile called!");
                }
        }
}
 
 
Menu.as
 
package 
{
        import flash.display.MovieClip;
 
        public class Menu extends MovieClip
        {
 
                private var _main:Main;
 
                public function Menu(target:Main)
              {                       
                        _main = target;
                        _main.showProfile();
                }
        }
}

Чего у вас пишет, какая ошибка текст ошибки увидел на предыдущей странице

в чем работаете, чем компилите?

джонатан 20.10.2010 20:41

Adobe Flash Professional CS5

Сам не пойму, обычно в таких ситуациях ошибки небыло никогда. :(

Vier 21.10.2010 01:49

Покажи еще класс Main. В таком виде у меня тоже ошибки нет.

in4core 21.10.2010 01:55

Код AS3:

public class PersonagesRepository extends MovieClip {
 
        public function PersonagesRepository( mainLink:Object ) {
                main = mainLink as Main; // что такое Main и где оно определено?
                main.showProfile();
        }
}

Добавлено через 1 минуту
Код AS3:

this.parent.removeChild( this );

понравилось.... ))) Но тут мне тоже кажется проблема в компиле. или что то не так делаете. в чистом виде вам показали все верно

Добавлено через 4 минуты
Код AS3:

currentPersonage === 1

и вот это тоже кстати неплохо

джонатан 21.10.2010 04:07

Я конечно в АС3 новичек, но что вызвало у вас столько радости в последних двух цитатах кода, мне не понятно? Вы не слышали что такое строгое равенство? И что забавного во второй цитате?
Main это класс fla документа, который находится в том же пакете что и PersonagesRepository.

Кстати:
Код AS3:

currentPersonage === 0
currentPersonage === PersonagesRepository.personagesData.personage.length() - 2
currentPersonage === PersonagesRepository.personagesData.personage.length() - 1

Вам не показалось смешным?

КорДум 21.10.2010 08:34

Цитата:

А как же мне тогда быть? Я просто хочу из Menu вызывать методы Main... Но не хочу ограничиваться только статикой.
Значит вы неправильно спроектировали свою идею. Создайте контроллер в Main, он содержит в себе нужные методы для управления меню, в конструктор меню передайте ссылку на этот класс. Хотя должно быть наоборот, ссылка на меню должна передаваться в контроллер меню.

Hidest 21.10.2010 11:49

Или шлите событие из своего меню, а уже в main его ловите и делайте, что нужно.

джонатан 21.10.2010 14:22

Да с меню тем я уже разобрался, это поднял тему уже по другому проекту, чтобы не создавать новую, т.к. похожая проблема.

in4core 21.10.2010 15:48

В том то и дело - нафига строгое равенство к единице а ? Что ты этим хочешь добится ? В твоем случае разница ==1 от ===1 какая?* Для чего онное писать

Ну а по второй цитате - убить самого себя мне нравится, просто как звучит_)___)))

КорДум 21.10.2010 15:58

in4core, не ругайте человека за то, что он пишет правильно. Здесь есть разница. При нестрогом неравенстве, насколько мне известно, происходит приведение к одному типу данных. В строгом - нет.

Bgg 21.10.2010 16:07

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

джонатан 21.10.2010 17:38

КорДум, +1.

Bgg, не забываю :)

джонатан 05.11.2010 17:19

Уловил причину ошибки, она выскакивает при вызове методов главного класса документа.


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

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