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

EndoCrinologist 31.01.2016 00:48

Как осуществить простейший переход от одного "экрана" к другому?
 
Есть у меня класс Main, который при загрузке флешки подключает класс IntroPage, где изначальная текстовая заставка.. После клика в любом через IntroPage в Main происходит вызов функции:
Код AS3:

public function changePage_toEnterName():void
{
        while (numChildren) removeChildAt(0);
        var enterName:EnterName = new EnterName;
        addChild(enterName);
}

В классе EnterName юзер вводит свое имя. Это имя я хочу отобразить на верхней панели, которая находится в классе UpPanel. При нажатии на Enter после того, как юзер закончил вводить имя, оно должно отобразиться на ней в текстовом поле на панели UpPanel. Но этого не происходит, так как у меня все функции перехода от экрана к экрану содержат это:
Код AS3:

while (numChildren) removeChildAt(0);

Такой вопрос.. Как мне грамотно осуществлять переходы?
Вот такой метод мне не подошел:
Код AS3:

private function init(e:Event = null):void 
{
        removeEventListener(Event.ADDED_TO_STAGE, init);
 
        var introPage:IntroPage = new IntroPage;
        addChild(introPage);
}

Потому что в IntroPage такая вот строка
Код AS3:

tf.width = Main.THIS.stage.stageWidth;

вызывает ошибку доступа к свойству.

Не знаю, что делать.. Может посоветуете литературу какую-нибудь, которая учит мыслить классово? :(

На всякий случай привожу коды классов.
MAIN
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        /**
        * ...
        * @author Volodin A.S.
        */

        public class Main extends Sprite
        {
                public static var THIS:Main = null;
 
                private var USER_NICK:String = '';
 
                public var upPanel:UpPanel = new UpPanel;
 
                public function Main():void
                {
                        THIS = this;
 
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
 
                        var introPage:IntroPage = new IntroPage;
                        addChild(introPage);
                }
                public function changePage_toEnterName():void
                {
                        while (numChildren) removeChildAt(0);
 
                        var enterName:EnterName = new EnterName;
                        addChild(enterName);
                }
 
                public var connectServer:ConnectServer = new ConnectServer;
                public function changePage_toConnectServer():void
                {
                        while (numChildren) removeChildAt(0);
                        addChild(connectServer);
                }
 
                public function setUserNick(nick:String):void
                {
                        this.USER_NICK = nick;
                }
 
        }
 
}

INTROPAGE
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.text.TextField;
        import flash.text.TextFormat;
        import flash.text.TextFormatAlign;
        /**
        * ...
        * @author Volodin A.S.
        */

        public class IntroPage extends Sprite
        {
 
                public function IntroPage()
                {
 
                        var ttf:TextFormat = new TextFormat;
                        ttf.color = 0x000000;
                        ttf.size = 30;
                        ttf.align = TextFormatAlign.CENTER;
                        ttf.font = 'Tahoma';
 
                        var tf:TextField = new TextField;
                        tf.defaultTextFormat = ttf;
                        tf.text = 'PERSONS\nClick for continue...';
                        tf.width = Main.THIS.stage.stageWidth;
                        tf.mouseEnabled = false;
 
                        var tf_halfHeight:Number = 0;
                        tf_halfHeight = tf.height / 2;
                        tf.y = Main.THIS.stage.stageHeight/2 - tf_halfHeight;
 
                        addChild(tf);
 
                        var spr:Sprite = new Sprite;
                        spr.graphics.beginFill(0,0);
                        spr.graphics.drawRect(0, 0, Main.THIS.stage.stageWidth, Main.THIS.stage.stageHeight);
                        addChild(spr);
 
                        spr.addEventListener(MouseEvent.MOUSE_UP, function (e:Event):void
                        {
                                Main.THIS.changePage_toEnterName();
                        });
                }
 
        }
 
}

ENTERNAME
Код AS3:

package 
{
        import flash.events.KeyboardEvent;
        import flash.text.TextFieldType;
        import flash.display.Sprite;
        import flash.text.TextField;
        import flash.events.Event;
        import flash.text.TextFormat;
        import flash.text.TextFormatAlign;
        /**
        * ...
        * @author Volodin A.S.
        */

        public class EnterName extends Sprite
        {
                public static var THIS:EnterName = null;
 
                public function EnterName():void
                {
                        THIS = this;
 
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
 
                        var ttf:TextFormat = new TextFormat;
                        ttf.color = 0x000000;
                        ttf.size = 30;
                        ttf.align = TextFormatAlign.CENTER;
                        ttf.font = 'Tahoma';
 
                        var ttf_input:TextFormat = new TextFormat;
                        ttf_input.color = 0x000000;
                        ttf_input.size = 30;
                        ttf_input.align = TextFormatAlign.CENTER;
                        ttf_input.font = 'Tahoma';
 
                        var tf:TextField = new TextField;
                        tf.defaultTextFormat = ttf;
                        tf.text = 'Enter your name here:';
 
                        tf.width = Main.THIS.stage.stageWidth;
                        tf.mouseEnabled = false;
 
                        var tf_halfHeight:Number = 0;
                        tf_halfHeight = tf.height / 2;
                        tf.y = Main.THIS.stage.stageHeight/2 - tf_halfHeight/2;
                        addChild(tf);
 
                        var input:TextField = new TextField();
                        input.defaultTextFormat = ttf_input;
                        input.width = 300;
                        input.height = 40;
                        //input.y = 20;
                        input.type = TextFieldType.INPUT;
                        input.border = true;
 
                        var input_halfWidth:Number = 0;
                        input_halfWidth = input.width / 2;
                        input.x = Main.THIS.stage.stageWidth/2 - input_halfWidth;
 
                        var input_halfHeight:Number = 0;
                        input_halfHeight = tf.height / 2;
                        input.y = Main.THIS.stage.stageHeight/2 + input_halfHeight/2;
 
                        addChild(input);
 
                        stage.focus = input;       
 
 
                        input.addEventListener(KeyboardEvent.KEY_UP, function(e:KeyboardEvent):void
                        {
                                var textField:TextField = e.target as TextField;
                                var str:String = textField.text;
 
                                if (e.keyCode == 13)
                                {
                                        if (str.length > 3)
                                        {
                                                Main.THIS.setUserNick(input.text);
                                                Main.THIS.upPanel.setUserNamePanel(input.text);
                                                Main.THIS.changePage_toConnectServer();
                                        }
                                }
                        });
                }
 
        }
 
}

P.S. А тут есть спойлеры, чтобы сжать содержимое поста?

UPD.
Цитата:

Потому что в IntroPage такая вот строка
tf.width = Main.THIS.stage.stageWidth;
вызывает ошибку доступа к свойству.
Перепутал, не из-за этого. А из-за того, что к этой переменной
Код AS3:

var introPage:IntroPage = new IntroPage;

нет доступа и я не могу удалить его через removeChild().
А если как раз-таки сделать через public var - будет ошибка доступа

Добавлено через 28 минут
Решил удалять по индексу...

MoHaX 31.01.2016 01:28

Сложно понять в чем проблема.

Код AS3:

while (numChildren) removeChildAt(0);

Этот код убирает с дисплея все элементы. Возможно тебе стоит разобраться с тем как он работает.

EndoCrinologist 31.01.2016 01:48

да я знаю, как он удаляет.. удаляет всех детей, начиная с первого, пока на сцене есть дети... ладно. Сложно мне пока в этом всём разобраться..

GBee 31.01.2016 03:02

Ололошеньки. Родитель управлять должен детьми.
Удаляйте THIS вообще. У всех визуальных объектов есть ссылка на stage, так что ловите в IntroPage то же событие ADDED_TO_STAGE.
Если хотите, чтобы Main для ENTERNAME что-то сделал, то либо кидайте из ENTERNAME событие, по которому мейн будет решать, что делать. Либо прокидывайте в детей ссылку на мейн, и потом жутко мучайтесь.

EndoCrinologist 16.02.2016 03:54

Спасибо за ответ

namespaces 25.02.2016 19:08

Думаю для вашей задачи подошел бы паттерн Фабричный метод. Если еще не знакомы с этим шаблоном, есть такой фреймворк Flashflowfactory https://code.google.com/archive/p/stroep/, можно взять на изучение, или оптимизировать под свои задачи.

dimarik 25.02.2016 21:35

В принципе, вы никуда не денетесь от того, что нужно что-то удалять и что-то добавлять в дисплейлист, чтобы что-то показать или чтобы что-то скрыть. Ну, нормальная практика делать removeChild. И в отличие от смены DisplayObject::visible на false имеет свои преимущества в виде освобождения памяти. Т.е. идеологически вы правы.

Цитата:

Сообщение от EndoCrinologist (Сообщение 1191399)
Потому что в IntroPage такая вот строка
Код AS3:

tf.width = Main.THIS.stage.stageWidth;

вызывает ошибку доступа к свойству.

Тут только три варианта: на момент исполнения либо не определено tf, либо Main.THIS, либо, что более часто встречается, Main.THIS.stage.

Код AS3:

while (numChildren) removeChildAt(0);

Конструкция для современных Flash player (Версии среды выполнения:AIR 3.0, Flash Player 11) заменяется на DisplayObjectContainer::removeChildren()

Ну и на слова "у меня есть класс, который бла бла бля", типа вашего
Код:

Есть у меня класс Main, который при загрузке флешки подключает класс IntroPage,
,
я всегда говорю, что нужно различать класс, и объект, принадлежащий этому типу (классу и его цепочки надклассов и интерфейсов). Когда возникнет понимание что есть класс, а что объект этого класса (на самом деле объект имеет тип этого класса и еще множество типов, как я говорил, надклассов и интерфейсой), будет полегче. Я постиг эту тайну, прочитав внимательно прелюдию к основным паттернам в книжеце, которая изменила мой мир. В конце концов, каждый сам приходит к ООП через что-то своё.


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

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