Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Добавить экземпляр класса в Main (http://www.flasher.ru/forum/showthread.php?t=211397)

EndoCrinologist 22.08.2015 20:48

Добавить экземпляр класса в Main
 
Ух, осуществилась мечта, начал изучать AS3... Идея проста - перенести свою игру-сайт во флеш... И, так сказать, уже появились проблемы... Изначально был такой вариант:
Вот класс Main:
Код AS3:

package
{
        import flash.display.Loader;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.net.URLRequest;
        import flash.text.TextField;
        import vk.APIConnection;
        import vk.api.serialization.json.JSON;
 
        /**
        * ...
        * @author Volodin Alexandr Sergeevich
        */

        public class Main extends Sprite
        {
 
                public function Main()
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                public var flashVars:Object = stage.loaderInfo.parameters as Object;
                public var VKAPI:APIConnection = new APIConnection(flashVars);
                public static var avatar:String = new String;
 
                private var txt:TextField;
 
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
 
                        txt = new TextField();
                        txt.width = 800;
                        txt.height = 600;
                        txt.wordWrap = true;
                        txt.appendText("> flashVars: " + JSON.encode(flashVars) + "\n\n");
                        addChild(txt);
 
                        VKAPI.api(
                                "users.get", { user_ids:flashVars['viewer_id'], fields:"photo_50", name_case:"nom" }, usersGetSuccess, usersGetError
                        );
                }
 
                public function usersGetSuccess(data:Object):void
                {
                        txt.appendText("> usersGet: " + JSON.encode(data) + "\n\n");
                        avatar = data[0].photo_50;
 
                        txt.appendText("> avatar: " + avatar + "\n\n");
 
                        var loader:Loader = new Loader();
                        loader.load(new URLRequest(avatar));
                        loader.x = 100;
                        loader.y = 100;
                        addChild(loader);
                }
 
                public function usersGetError(data:Object):void
                {
                        txt.appendText("> usersGet: error: " + JSON.encode(data) + "\n\n");
                }
 
        }
 
}

Вот результат его действий:
https://pp.vk.me/c628120/v628120999/...vU-R7Uu-js.jpg

То есть, всё работает. Теперь, я немного преобразую и создам класс Profile, куда помещу весь код из Main.
Класс Main:
Код AS3:

package
{
 
        import flash.display.Sprite;
        import flash.events.Event;
        /*
        import flash.display.Loader;
        import flash.net.URLRequest;
        import flash.text.TextField;
        import vk.APIConnection;
        import vk.api.serialization.json.JSON;
        */

        /**
        * ...
        * @author Volodin Alexandr Sergeevich
        */

        public class Main extends Sprite
        {
 
                public function Main()
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                /*
                public var flashVars:Object = stage.loaderInfo.parameters as Object;
                public var VKAPI:APIConnection = new APIConnection(flashVars);
                public static var avatar:String = new String;
 
                private var txt:TextField;
                */

 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
 
                        addChild(new Profile); // добавил класс в Main
 
                        /*
                        txt = new TextField();
                        txt.width = 800;
                        txt.height = 600;
                        txt.wordWrap = true;
                        txt.appendText("> flashVars: " + JSON.encode(flashVars) + "\n\n");
                        addChild(txt);
 
                        VKAPI.api(
                                "users.get", { user_ids:flashVars['viewer_id'], fields:"photo_50", name_case:"nom" }, usersGetSuccess, usersGetError
                        );
                        */

                }
 
                /*
                public function usersGetSuccess(data:Object):void
                {
                        txt.appendText("> usersGet: " + JSON.encode(data) + "\n\n");
                        avatar = data[0].photo_50;
 
                        txt.appendText("> avatar: " + avatar + "\n\n");
 
                        var loader:Loader = new Loader();
                        loader.load(new URLRequest(avatar));
                        loader.x = 100;
                        loader.y = 100;
                        addChild(loader);
                }
 
                public function usersGetError(data:Object):void
                {
                        txt.appendText("> usersGet: error: " + JSON.encode(data) + "\n\n");
                }
                */

        }
 
}

Класс Profile:
Код AS3:

package  
{
 
        import flash.display.Loader;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.net.URLRequest;
        import flash.text.TextField;
        import vk.APIConnection;
        import vk.api.serialization.json.JSON;
 
        /**
        * ...
        * @author Volodin Alexandr Sergeevich
        */

        public class Profile extends Sprite
        {
 
                public var flashVars:Object = stage.loaderInfo.parameters as Object;
                public var VKAPI:APIConnection = new APIConnection(flashVars);
                public static var avatar:String = new String;
 
                private var txt:TextField;
 
                public function Profile()
                {
                        txt = new TextField();
                        txt.width = 800;
                        txt.height = 600;
                        txt.wordWrap = true;
                        txt.appendText("> flashVars: " + JSON.encode(flashVars) + "\n\n");
                        addChild(txt);
 
                        VKAPI.api(
                                "users.get", { user_ids:flashVars['viewer_id'], fields:"photo_50", name_case:"nom" }, usersGetSuccess, usersGetError
                        );
                }
 
                public function usersGetSuccess(data:Object):void
                {
                        txt.appendText("> usersGet: " + JSON.encode(data) + "\n\n");
                        avatar = data[0].photo_50;
 
                        txt.appendText("> avatar: " + avatar + "\n\n");
 
                        var loader:Loader = new Loader();
                        loader.load(new URLRequest(avatar));
                        loader.x = 100;
                        loader.y = 100;
                        addChild(loader);
                }
 
                public function usersGetError(data:Object):void
                {
                        txt.appendText("> usersGet: error: " + JSON.encode(data) + "\n\n");
                }
 
        }
 
}

Но теперь вместо фотки - пустой экран:
https://pp.vk.me/c628120/v628120999/...2jkSGQWe8Q.jpg

Что не так делаю?

callme 22.08.2015 21:07

Пока вы не добавили объект на экран, его свойство stage равно null.

EndoCrinologist 22.08.2015 21:08

https://pp.vk.me/c628120/v628120999/...DYQdXQtdsk.jpg

callme 22.08.2015 21:18

У вас addChild() выполняется после создания объекта.

Строчка stage.loaderInfo.parameters выполняется до addChild().

EndoCrinologist 22.08.2015 21:21

То есть, сначала нужно добавить через addChild что-то на сцену, а потом заполнять его или что?

Добавлено через 54 секунды
Просто хочу понять, как правильно добавить экземпляр на сцену.

Добавлено через 3 минуты
Таким макаром не получилось..
https://pp.vk.me/c628120/v628120999/...6tXMwwaNVk.jpg

callme 22.08.2015 21:39

Код AS3:

package
{
 
        import flash.display.Sprite;
        import flash.events.Event;
        /*
        import flash.display.Loader;
        import flash.net.URLRequest;
        import flash.text.TextField;
        import vk.APIConnection;
        import vk.api.serialization.json.JSON;
        */

        /**
        * ...
        * @author Volodin Alexandr Sergeevich
        */

        public class Main extends Sprite
        {
 
                public function Main()
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                /*
                public var flashVars:Object = stage.loaderInfo.parameters as Object;
                public var VKAPI:APIConnection = new APIConnection(flashVars);
                public static var avatar:String = new String;
 
                private var txt:TextField;
                */

 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
 
                        addChild(new Profile); // добавил класс в Main
 
                        /*
                        txt = new TextField();
                        txt.width = 800;
                        txt.height = 600;
                        txt.wordWrap = true;
                        txt.appendText("> flashVars: " + JSON.encode(flashVars) + "\n\n");
                        addChild(txt);
 
                        VKAPI.api(
                                "users.get", { user_ids:flashVars['viewer_id'], fields:"photo_50", name_case:"nom" }, usersGetSuccess, usersGetError
                        );
                        */

                }
 
                /*
                public function usersGetSuccess(data:Object):void
                {
                        txt.appendText("> usersGet: " + JSON.encode(data) + "\n\n");
                        avatar = data[0].photo_50;
 
                        txt.appendText("> avatar: " + avatar + "\n\n");
 
                        var loader:Loader = new Loader();
                        loader.load(new URLRequest(avatar));
                        loader.x = 100;
                        loader.y = 100;
                        addChild(loader);
                }
 
                public function usersGetError(data:Object):void
                {
                        txt.appendText("> usersGet: error: " + JSON.encode(data) + "\n\n");
                }
                */

        }
 
}

Код AS3:

package  
{
 
        import flash.display.Loader;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.net.URLRequest;
        import flash.text.TextField;
        import vk.APIConnection;
        import vk.api.serialization.json.JSON;
 
        /**
        * ...
        * @author Volodin Alexandr Sergeevich
        */

        public class Profile extends Sprite
        {
 
                public var flashVars:Object;
                public var VKAPI:APIConnection;
                public static var avatar:String = new String;
 
                private var txt:TextField;
 
                public function Profile()
                {
                        txt = new TextField();
                        txt.width = 800;
                        txt.height = 600;
                        txt.wordWrap = true;
                        addChild(txt);
 
                        addEventListener(Event.ADDED_TO_STAGE, addedToStage);
                }
 
                private function addedToStage(e:Event):void
                {
                        flashVars = stage.loaderInfo.parameters as Object;
                        VKAPI = new APIConnection(flashVars);
 
                        txt.appendText("> flashVars: " + JSON.encode(flashVars) + "\n\n");
 
                        VKAPI.api(
                                "users.get", { user_ids:flashVars['viewer_id'], fields:"photo_50", name_case:"nom" }, usersGetSuccess, usersGetError
                        );
                }
 
                public function usersGetSuccess(data:Object):void
                {
                        txt.appendText("> usersGet: " + JSON.encode(data) + "\n\n");
                        avatar = data[0].photo_50;
 
                        txt.appendText("> avatar: " + avatar + "\n\n");
 
                        var loader:Loader = new Loader();
                        loader.load(new URLRequest(avatar));
                        loader.x = 100;
                        loader.y = 100;
                        addChild(loader);
                }
 
                public function usersGetError(data:Object):void
                {
                        txt.appendText("> usersGet: error: " + JSON.encode(data) + "\n\n");
                }
 
        }
 
}

Добавлено через 1 минуту
Напишите к каким выводам пришли после прочтения моего кода.

EndoCrinologist 22.08.2015 21:47

надо же.. получилось... А что вообще произошло, если не секрет? Что не так было?

Добавлено через 3 минуты
Я так понял, если надо что-то добавить на сцену, надо это инициировать через ADDED_TO_STAGE?

Добавлено через 5 минут
А нееееееет... Просто добавилось раньше, чем отправился запрос... Поэтому данных не было, хотя само тектовое поле было. Правильно?

samana 22.08.2015 22:23

Цитата:

Сообщение от EndoCrinologist (Сообщение 1185949)
А что вообще произошло, если не секрет?

Просто все манипуляции, где вы использовали stage, выполнились тогда, когда эта stage стала доступной.

EndoCrinologist 22.08.2015 22:57

А такой вопрос: как мне получить доступ к stage.height? опять нужно что-то инициировать или если произошло инициирование, то уже доступен этот параметр?

Добавлено через 1 минуту
и да, допустим я создал экземпляр Profile. Допустим, я вывожу не только фото, но и данные игры (сколько очков, уровень и т.д.) и мне надо обновить эти данные. каким способом мне лучше всего пересоздать экземпляр, если один уже есть?

neonoviiwolf 22.08.2015 23:21

постараюсь на пальцах
ADDED_TO_STAGE - просто слушатель события, который срабатывает, когда появился доступ к stage
когда вы пишите
Код AS3:

var AABB:Class = new Class//ваш класс

то выполняется код в классе, но если вы что-то в этом классе добавляете на сцену, то это не произойдёт, т.к. ссылки на stage нету
что бы класс получил ссылку на stage, то нужно написать, после инициализации, addChild(Ваш класс)
по этому используется слушатель ADDED_TO_STAGE, выполниться весь код, кроме того, что вызовет этот слушатель, а когда вы добавите ваш класс на сцену, то выполниться остальная часть, в ней как раз и стоит что либо добавлять на сцену, можно конечно обойти(передать ссылку на stage при вызове класса), но не стоит писать такой код


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

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