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

niil 23.11.2009 12:15

Глобальные переменные
 
Вопрос вроде элементарный, но не могу найти ничего конкретного:
Есть массив который описывается в Scene1.Frame1 как:
Код AS3:

var NameArr:Array=new Array

Далее тут же идет его заполнение.
Сущесвует DynamicText с расположением:
Код AS3:

this.pn1.mcg.te1

В AC pn1 на 2-ом фрейме , то есть когда этот te1 создается прописываю:

Код AS3:

mcg.te1.text = NameArr[1].toString();

Разумеется вылетает ошибка неизвестной переменной NameArr!
Как же мне ей прописать глобальность. _global - вроде не помогает. Подскажите!

lighto 23.11.2009 12:21

public static const pSQL:String
чтот типа того

niil 23.11.2009 12:34

Цитата:

Сообщение от lighto (Сообщение 867624)
public static const pSQL:String
чтот типа того

public - тока для пакетов, у меня AC в самой Scene прописан
static - для классов
Вобщем, не проходит - есть еще варианты?

Добавлено через 3 часа 51 минуту
Неужели не кто не в курсе????

SamFR 23.11.2009 16:29

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

А вообще, от них по-возможности надо избавляться. Сквозная функциональность – это ещё куда ни шло, без неё часто никак, но глобальные поля – это уже не хорошо :)

niil 23.11.2009 17:02

Пытаюсь реализовать. Создаю класс:
Код AS1/AS2:

package exload{
    public class ArrNameClass {
                public var NameArr:Array = new Array;
    }
}

Подключаю и обрабатываю в Scene1,Frame1:
Код AS3:

import exload.ArrNameClass;
var NameArrCl = new ArrNameClass;
NameArrCl.NameArr[i] = Name;

В Мувике на 2-ом фрейме пытаюсь все это вытащить, но неудачно. Код не обрабатывается:
Код AS3:

import exload.ArrNameClass;
var NameArrCl = ArrNameClass;
this.mcg.te1.text = NameArrCl.NameArr[1].toString();


SamFR 23.11.2009 22:33

Код AS3:

package exload{
    public class ArrNameClass {
                public static var nameArr:Array = new Array();
    }
}

Код AS3:

import exload.ArrNameClass;
ArrNameClass.nameArr[i] = Name;

Код AS3:

import exload.ArrNameClass;
this.mcg.te1.text = ArrNameClass.nameArr[1].toString();

Но, как я уже сказал, так лучше не делать :)

lighto 24.11.2009 07:17

Цитата:

Сообщение от SamFR (Сообщение 867772)
Но, как я уже сказал, так лучше не делать :)

Почему? и вопрос зачем блокировали такой простой весч как глобальные переменные недавно сам с тем же сталкнулся) запарился пока решил как сделать)

SamFR 24.11.2009 13:59

Никто их не блокировал. Просто теперь нельзя обратиться к не определённому явно свойству нединамического объекта. Никто, вам, на самом деле, не мешает сделать

Код AS3:

(root as Object).myVar = 123;
trace('myVar = ' + (root as Object).myVar);

, приведя таким образом любой тип к динамическому типу Object.

Почему лучше не делать как в этом и предыдущем примерах? Код написан в кадрах, что само по себе сильно затрудняет его понимание и дальнейшее сопровождение (не говоря уже о встроенном редакторе =). this.mcg.te1.text – явный нетипизированный доступ к какому-то вложенному текстовому полю – тоже не лучший вариант. Ну и привязка к глобальным переменным (или к root) – вообще вещь нехорошая. Ибо, во-первых, таким образом мы лишаемся гибкости, привязывая написанный нами код к каким-то глобальным данным/функциям, без которых он работать не будет. И во вторых, в таком коде намного сложнее разобраться.

Естественно, тут всё зависит от того, какую цель мы ставим. Если нужно написать учебную/тестовую программку в пару сотен строк, то писать можно, в принципе, как угодно. Лишь бы не привыкнуть :) Так как с ростом объёма проектов на первое место выходят такие вещи, как продуманная архитектура, модульность, понятность, гикость, расширяемость. Стабильность, кстати, тоже) Вот тут уже о коде в кадрах, повсеместном нетипизированном доступе и привязке к руту речи идти не может.

Котяра 24.11.2009 14:41

Сделайте один глобальный класс Синглетон. Если очень нужно (но не рекомендуется) - сделайте его динамическим.
Код AS3:

package  
{
        /**
        * Класс глобальных переменных
        * @author k0t0vich
        */

        public dynamic class GlobalSingleton
        {
 
                public function GlobalSingleton()
                {
 
                }
 
                private static var _instance: GlobalSingleton = null;
                public static function get instance(): GlobalSingleton{
 
                        if(!_instance) {
                                _instance = new GlobalSingleton();
                        }
                        return _instance;
                }
 
 
 
                public function GlobalSingleton()
                {
                        if(_instance)
                                throw new Error("Use instance method!");               
                }
        }
 
}

доступ к нему будет:
Код AS3:

GlobalSingleton.instance.someVar


Mur4ik 24.11.2009 15:17

В данном случае если уж сильно хочется, то можно создать мувиклип (наприер mcGlobal), который будет присутствовать во всех кадрах (можно даже невидимым или пустым), и ему уже присваивать новый массив и заполнять этот массив, далее так же к массиву через темповый мувик и обпращаться (mcGlobal.nameArr[1]), но это все "костыли".

Если что то нужно во втором кадре то и создавайте это во втором кадре :)


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

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