Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   ссылка на свойство stage (http://www.flasher.ru/forum/showthread.php?t=137155)

tkaChuck 05.03.2010 19:38

ссылка на свойство stage
 
Здравствуйте.
Я, в общем, это. У меня есть некоторый массив, объявленный прямо в stage. Я хочу ссылку на этот массив. То есть грубо говоря если работает
Код AS3:

var a1:Array=new Array(1,2,3);
var a2:Array=a1; //типа ссылка на a1
trace(a2); //1,2,3
 
a2[0]=4; 
trace(а1); //4,2,3

, то должно както работать и чтото вроде
Код AS3:

//это в stage
var a1:Array=new Array(1,2,3);
 
//а это гдето в дисплейлисте
var a2:Array=stage.a1;

но компилятор на такое говорит, что 1119: Access of possibly undefined property prtf through a reference with static type flash.display:Stage

я понимаю, что это совсем неэлегантно - лезть из потомка к свойствам родителя. куда забавней видимо диспатчить событие из объекта, слушать его в stage и присваивать объекту тот массив. я понимаю теоретически но пока не осилю такое. и щас мне хватило бы иметь доступ к stage, как раньше к _root. видимо я не понимаю чегото в принципе.

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

relevance4 05.03.2010 20:44

Цитата:

Сообщение от tkaChuck (Сообщение 891237)
объявленный прямо в stage.

stage != document class, если вы об этом.

Цитата:

Сообщение от tkaChuck (Сообщение 891237)
все, чего хочу я - иметь доступ к этому массиву из разных объектов. как сделать такую ссылку?

Код AS3:

можно так:
obj = new Class(a1);
или так
obj = new Class(this);

но это, наверное, не правильно.

Psycho Tiger 05.03.2010 21:22

Если такой массив один - сделайте статическую переменную.

Zebestov 05.03.2010 21:24

создай какой-то public class MyArray и в нем сделай static public var a:Array = [];
и будет тебе read/write доступ к этому массиву из всех объектов посредством MyArray.a

tkaChuck 06.03.2010 04:40

спасибо, товарищи.

2relevance4: такую конструкцию я ранее не видал. это как бы мы говорим что obj будет новым экземпляром класса Class, и передаем конструктору этого класса наш массив a1? боюсь и подумать какое исчадие это породит. или проделываем то же самое, но с this. a this в том, что раньше называлось _root, разве не будет означать stage? какой с этого прок? я конечно почитаю про Class, но похоже, я Вас просто не понимаю..

2Psycho Tiger: вот оно! массив-то как раз один, но. как мне объявить ее в stage, ну или как это правильно сказать.

2Zebestov: да вот как раз пытался. но не могу до конца освободиться от идеологии AS1/AS2. я сделал класс, и этот массив теперь свойство класса. далее я создаю экземляр этого класса В STAGE, потому что где же еще, и имею 1119: Access of possibly undefined property through a reference with static type. хорошо, наверно в stage ничего класть не принято, а тогда ГДЕ ЭТОТ ОБЪЕКТ СОЗДАВАТЬ?

вообше, знаете, просто пробивая по поиску тяжело понять вообще, это. ЗАЧЕМ НУЖНЫ статические классы. безопасность? ОТ КОГО? и зачем все элементы класса по дефолту private? хороший сыщик подозревает самого себя? и почему обращаться к родителю из потомка это дурной тон? И ПОЧЕМУ НЕЛЬЗЯ УДАЛЯТЬ ОБЪЕКТЫ ВРУЧНУЮ???? простите за оффтоп.. может кто посоветует хорошую книгу.

Cornford 06.03.2010 14:32

а вот интересно почему эта строчка: trace(а1); //4,2,3 выдаёт 4,2,3, ведь мы меняем первый элемент у массива а2, он связан с а1 но а1 не связан с а2

Obi 06.03.2010 14:49

Цитата:

Сообщение от Cornford (Сообщение 891346)
а вот интересно почему эта строчка: trace(а1); //4,2,3 выдаёт 4,2,3, ведь мы меняем первый элемент у массива а2, он связан с а1 но а1 не связан с а2

Вы меняете элемент у первого массива. a2 — всего лишь ссылка на массив a1.

Elser 06.03.2010 15:30

Код AS3:

var needEmptyArray:Boolean = true; // ну это может перестарался, но люблю объяснять кодом ))
var a2:Array = (stage != null) ? (stage as MovieClip).a1 : needEmptyArray ? new Aray() : null;


Obi 06.03.2010 15:44

Цитата:

Сообщение от Elser (Сообщение 891378)
Код AS3:

var a2:Array = (stage != null) ? (stage as MovieClip).a1 : needEmptyArray ? new Aray() : null;


Прошу прощения за оффтоп, но я надеюсь что мне никогда не придется разбираться в вашем коде.

Elser 06.03.2010 16:17

хорошо, выбирайте кому что нравится )
Код AS3:

//так я делаю в API разных модулей для Obi и ему подобных:
 
var needEmptyArray:Boolean = true;
var a2:Array;
if(stage != null) {
  a2 = (stage as MovieClip).a1;
} else {
  if(needEmptyArray){
        a2 = new Array();
  } else {
        a2 = null;
  }
}
 
//а так я делаю для себя и тех кто не испытывает особых затруднений с чтением кода:
 
var needEmptyArray:Boolean = true;
var a2:Array = (stage != null)
    ? (stage as MovieClip).a1
    : needEmptyArray
        ? new Aray()
        : null;


Zebestov 06.03.2010 17:28

Цитата:

Сообщение от tkaChuck (Сообщение 891321)
2Zebestov: да вот как раз пытался. но не могу до конца освободиться от идеологии AS1/AS2. я сделал класс, и этот массив теперь свойство класса. далее я создаю экземляр этого класса В STAGE, потому что где же еще, и имею 1119: Access of possibly undefined property through a reference with static type. хорошо, наверно в stage ничего класть не принято, а тогда ГДЕ ЭТОТ ОБЪЕКТ СОЗДАВАТЬ?

нигде =) в этом и прелесть статических свойств и методов — для обращения к ним не нужно создавать экземпляр класса.
как я уже написал, вызов происходит так: MyArray.a
и все, никаких там new MyArray() и т.д.

Obi 06.03.2010 18:04

Цитата:

так я делаю в API разных модулей для Obi и ему подобных
А так делают остальные:
Код AS3:

var needEmptyArray:Boolean = true;
var a2:Array;
 
if(stage) {
  a2 = (stage as MovieClip).a1;
} else if(needEmptyArray){
  a2 = new Array();
}


tkaChuck 07.03.2010 17:13

ух ты, AS поддерживает " ? : ". многие годы я пытался забыть об этом кошмаре)


2Obi: (stage as MovieClip) это первое что приходит в голову. я не знал или так можно, но признаться честно, с этого я начал. не хочет. приводит к известию о том, что TypeError: Error #1009: Cannot access a property or method of a null object reference. это я обращаюсь к нему когда Event.ADDED или Event.ADDED_TO_STAGE. stage есть, массива там нет. null. а из стейджа трейсится массив. вот такая штука.

2Zebestov: как нигде? а где тогда? ээ. ну вот смотрите.. я не знаю как объяснить это проще. я этот массив делаю из файла, а этот файл я парсю. вот этими вот руками). изображаю галерею по мотивам этого массива. можно ввести секретное слово и все там редактить. ну тоесть, есть у меня в руте массив и юзер перемещается по разным кадрам. в одном кадре грубо говоря один интерфейс, в другом - другой! потом юзер нажимает на кнопку сабмит. в этот момент он перемещается в кадр с надписью "please wait" и происходит аплоад всех файлов которые он решил добавить и того файла с базой, из которого мы делали массив в начале этой истории.
то есть я просто не знаю как это записывается, чтоб в руте лежало и все его могли. поскольку к массиву никак нет доступа, видно я не понимаю чего то так сказать ключевого. что вы думаете по этому поводу?

СлаваRa 07.03.2010 17:22

можно еще раз, только более на понятном русском(отредактируйте сообщение, а то каша какая - то)?

wvxvw 07.03.2010 17:38

Код AS3:

stage as MovieClip

Внезапно (Ц) стейдж окажется мувиклипом!

Zebestov 07.03.2010 17:45

2tkaChuck: я тут повспоминал русский... ну никак проще не могу описать, что значит "нигде" =) нигде — это буквально... хм...

создаем класс:
Код AS3:

public class MyArrayKeeper extends Object
{
        static public var myGlobalArray:Array = [];
        public function MyArrayKeeper():void
        {
        }
}

а в своем основном коде и в любом вспомогательном классе, который тоже будет оперировать с этим массивом, просто вверху в толпу импортов втули еще этот:

Код AS3:

import MyArayKeeper;

и все! и нигде не создавай никаких экземпляров этого класса (сделай усилие над собой, разберись со словами "нигде" и "никаких")

а чтобы работать с массивом, пиши так:
Код AS3:

MyArrayKeeper.myGlobalArray.push('тулим очередной элемент');
trace(MyArrayKeeper.myGlobalArray[0]);

и т.д.

wvxvw 07.03.2010 18:01

Как бы если вам просто нужно куда-то выложить массив, не создавая для этого дополнительный класс:
Код AS3:

package my.domain.project.library
{
    public const ARRAY:Array/*int*/ = [];
}

Пользоваться:
Код AS3:

package my.domain.project.anotherLibrary
{
    import my.domain.project.library.ARRAY;
    public class ArrayTester
    {
        public function ArrayTester()
        {
        super();
        ARRAY.push(100);
        trace(ARRAY);
        }
    }
}


derhab 07.03.2010 22:28

Цитата:

Сообщение от wvxvw (Сообщение 891565)
Как бы если вам просто нужно куда-то выложить массив, не создавая для этого дополнительный класс:
Код AS3:

package my.domain.project.library
{
    public const ARRAY:Array/*int*/ = [];
}


у меня почему-то щас флэшовый компилятор (CS3) не пропускает такое... только функция объявлена, но разницы не должно быть..
а раньше, помнится работало что-то подобное

wvxvw 08.03.2010 02:50

SDK4 вторая бета - компилируется нормально.

Psycho Tiger 08.03.2010 20:05

Цитата:

Сообщение от wvxvw (Сообщение 891562)
Код AS3:

stage as MovieClip

Внезапно (Ц) стейдж окажется мувиклипом!

Но кастуется же) Хотя к Stage я бы кастовал.

wvxvw 08.03.2010 22:21

Ну как бы Stage - только DisplayObjectContainer, а не Sprite и уж тем более не MovieClip.

Psycho Tiger 08.03.2010 22:40

Код AS3:

public class Stage extends DisplayObjectContainer

Угу, верно. Путают stage и root.

tkaChuck 11.03.2010 16:48

спасибо все.

2wvxvw: спасибо, это оно. case closed


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

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