Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Проблемы с масивом (http://www.flasher.ru/forum/showthread.php?t=71565)

intro 08.11.2005 18:06

Проблемы с масивом
 
У меня возникла проблема с массивом...
//Заполнение массива данными из XML файла
var my_xml:XML = new XML();
var xml_array:Array = new Array();
var i:Number;
var j:Number;
my_xml.ignoreWhite = true;
//my_xml.load("c:/XML/xml2.xml");
my_xml.load("http://localhost/xml2.php");
my_xml.onLoad = function() {
for (j=1; j<4; j++) {
for (i=1; i<4; i++) {
xml_array[j, i] = {id:my_xml.childNodes[0].childNodes[j-1].childNodes[i-1].childNodes[0].nodeValue};
//trace(my_xml.childNodes[0].childNodes[j].childNodes[i].childNodes[0].nodeValue);
trace(xml_array[j, i].id);
}
}
}
//Отображение фигуры в зависимости от значения в массиве
if (xml_array[1, 1].id == 0) {
my_color = new Color(this.podstan_1);
my_color.setRGB(0xFF0000);
} else {
my_color = new Color(this.podstan_1);
my_color.setRGB(0x00FF99);
}
trace (xml_array[1,2].id);

Так вот после выхода из функции onLoad, массива не существует... Надо ли массив объявлять как глобальный? Если да, то как?

wwwita 08.11.2005 18:14

сделай его в руте и заполняй его из onLoad как
_root.xml_array[j, i]

все переменные, что заданы в корне кадра (не в каком нибудь мувике) - считаются глобальными.
глобальные переменные существуют в течении одного кадра, если хочешь чтобы они были везде - растяни кадр на столько на сколько тебе нужно. * так было в flash mx, может в 7-ке и 8-ке что-нибудь могло измениться.

wwwita 08.11.2005 18:16

да, изменилось... в 8-ке если один раз задать в корне переменную она видна из любого кадра :)

iNils 08.11.2005 18:23

Цитата:

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

они считаеются рутовыми, а не глобальными
Цитата:

Сообщение от wwwita
глобальные переменные существуют в течении одного кадра, если хочешь чтобы они были везде - растяни кадр на столько на сколько тебе нужно. * так было в flash mx, может в 7-ке и 8-ке что-нибудь могло измениться.

они существуют в любом кадре и не надо ничего растягивать, создаются они через _global

wwwita 08.11.2005 18:29

Чувак, факт есть факт, а у кого какие понятия - зависит от распальцовки ;)

iNils 08.11.2005 18:31

Цитата:

Сообщение от wwwita
Чувак, факт есть факт, а у кого какие понятия - зависит от распальцовки ;)

Далеко ты с такими знаниями пойдешь :)

wwwita 08.11.2005 18:36

уже ушел.. не догонишь

7thsky™ 08.11.2005 18:46

iNils - а ты посмотри массив то какой крутой :)

Код:

trace(xml_array[j, i].id);
почитать по теме

iNils 08.11.2005 18:52

Цитата:

Сообщение от 7thsky™
iNils - а ты посмотри массив то какой крутой :)

Код:

trace(xml_array[j, i].id);
почитать по теме

А слона то я и не приметил :)
обращение к двухмерному массиву осуществляется так
xml_array[j][i]

intro 08.11.2005 19:01

Странно, но почему-то у меня на заполнение массива такого формата xml_array[j][i] выдает ошибку, а вот формат xml_array[j, i] работает нормально без всяких проблем. И заполняется и выводится.
Плиз... Прошу... Ответьте конкретней, что мне надо сделать, что бы массив читалься вне функции? Заранее благодарен.

iNils 08.11.2005 19:07

xml_array = [];
xml_array[2, 1] = 5;
xml_array[1] = 6;
trace (xml_array[2, 1]);
trace (xml_array[1]);
trace (xml_array[2]);
//////////
trace ("--------------")
//////////
xml_array = [];
xml_array[2] = [];
xml_array[2][0] = 4;
xml_array[2][1] = 5;
trace (xml_array[2]);
trace (xml_array[2][1]);

7thsky™ 08.11.2005 19:08

:) приколист

iNils 08.11.2005 19:08

Цитата:

Сообщение от intro
Ответьте конкретней, что мне надо сделать, что бы массив читалься вне функции? Заранее благодарен.

_global.xml_array = []

и все...

iNils 08.11.2005 19:12

И еще про двухмерные массивы:
если тебе надо создать xml_array[i][j]
то после задания xml_array как массива
xml_array = []
нужно элемент xml_array[i] тоже сделать массивом
xml_array[i] = []

ну а трехмерный соответственно так
xml_array[i][j] = []
и будет xml_array[i][j][k] = "что то тут"

7thsky™ 08.11.2005 19:14

во флэше нету многомерных массивов, есть массивы ОДНОМЕРНЫЕ, многомерные эмулируются же таким образом, что элемент массива, сам является массивом

то бишь
Код:

var a:Array = new Array ();

for (var i:Number = 0; i < 10; i++) {
        a [i] = new Array ();
        for (var j:Number = 0; j < 10; j++) {
                a [i] [j] = 'test_' + i + '_' + j;
               
                trace ('>> a [ ' + i + ', ' + j +' ] > ' + a [i] [j]);
        } // end for
} // end for


K.A.T.A.F.A.L.K.E.R 08.11.2005 19:51

var my_xml:XML = new XML();
var xml_array:Array = new Array();
my_xml.ignoreWhite = true;
my_xml.load("http://localhost/xml2.php");
my_xml.onLoad = function(){
for (j=1; j<4; j++){
xml_array[j] = new Array();
for (i=1; i<4; i++) {
xml_array[j][i] = {id:my_xml.childNodes[0].childNodes[j-1].childNodes[i-1].childNodes[0].nodeValue};
trace(xml_array[j][i].id);
}
}
}
if (xml_array[1][1].id == 0) {
my_color = new Color(this.podstan_1);
my_color.setRGB(0xFF0000);
} else {
my_color = new Color(this.podstan_1);
my_color.setRGB(0x00FF99);
}
trace(xml_array[1][2].id);

Как там с обработкой ХМЛ-я не знаю, но с массивом, по идее, нужно так...

K.A.T.A.F.A.L.K.E.R 08.11.2005 19:55

ААААА!!! Сорри за повторение уже сказанного - не заметил вторую страницу :D

intro 09.11.2005 12:57

Объявить глобальную так можно?

_global.xml_array:Array = new Array();

У меня синтаксическая ошибка...

iNils 09.11.2005 13:02

нет, строгая типизация для _global не работает

надо так
_global.xml_array = new Array();

unlexx 09.11.2005 13:02

тебе же ЭкшенСкриптовским языком написали!!! Используй абсолютную адресацию (_root _level0 _global)
и вообще зачем делать массив из xml-ки?
можно же сразу брать значения из нод.

7thsky™ 09.11.2005 13:04

правильно что ошибка, сам посмотри что ты написал?! ты объявляешь переменную у объекта _global, при этом указываешь тип переменной, при этом не пишешь var :) короче напиши просто

_global.xml_array = new Array ();

iNils 09.11.2005 13:06

Цитата:

Сообщение от 7thsky™
ты объявляешь переменную у объекта _global, при этом указываешь тип переменной, при этом не пишешь var :)

Я не думаю, что он такие тонкости поймет.

intro 09.11.2005 13:08

Зачем по сто раз обращатся в XML, если один раз заполнил массив и с ним можно работать постоянно. Таа..а..к щаз попробуем...

intro 09.11.2005 13:09

Цитата:

Сообщение от iNils
Я не думаю, что он такие тонкости поймет.

прикалываетесь :(

iNils 09.11.2005 13:11

Цитата:

Сообщение от intro
прикалываетесь :(

когда прикалываюсь, я смайлик в конце ставлю.
если понял, то хорошо.

intro 09.11.2005 13:23

Не палит....

_global.xml_array = new Array();
var my_xml:XML = new XML();
my_xml.ignoreWhite = true;
my_xml.load("http://localhost/xml2.php");
my_xml.onLoad = function() {
k=1;
for (j=1; j<3; j++) {
for (i=1; i<3; i++) {
xml_array[k] = {id:my_xml.childNodes[0].childNodes[j].childNodes[i].childNodes[0].nodeValue};
k++;
}
}
};
for (i=1; i<10; i++) {
trace(xml_array[i].id);
}

unlexx 09.11.2005 13:34

Цитата:

Сообщение от intro
Зачем по сто раз обращатся в XML, если один раз заполнил массив и с ним можно работать постоянно. Таа..а..к щаз попробуем...

ага и хранить два массива данных вместо одного.
а к масиву ты будешь обращяться столько же раз
и многомерные массивы имеют свойство тормозить
вобщем вырабатывай свой стиль

intro 09.11.2005 13:41

Уже один массив... и тот не палит... :(
Помогите...please!

iNils 09.11.2005 13:46

а так?
xml_array[k] = {id:this.childNodes[0].childNodes[j].childNodes[i].childNodes[0].nodeValue};

unlexx 09.11.2005 13:51

дык если человек боиться xml? он ООП вообще испугаеться :)

intro 09.11.2005 14:00

Массив то оно заполняет....ну именно в функции... а вне ф-ции не выводит...пишет андифинет. Такое ощущение что сначало выполняется вывод массива, а потом только ф-ция...

unlexx 09.11.2005 14:08

_global.xml_array = new Array();
var my_xml:XML = new XML();
my_xml.ignoreWhite = true;
my_xml.load("http://localhost/xml2.php");
my_xml.onLoad = function() {
k=1;
for (j=1; j<3; j++) {
for (i=1; i<3; i++) {
_global.xml_array[k] = {id:my_xml.childNodes[0].childNodes[j].childNodes[i].childNodes[0].nodeValue};
k++;
}
}
};
for (i=1; i<10; i++) {
trace(_global.xml_array[i].id);
}

смотри выше поправленное

7thsky™ 09.11.2005 14:15

ох... во флэше загрузка асинхронная, загрузку ждать надо, для этого onLoad и существует

intro 09.11.2005 14:18

Неа... Не работает...

iNils 09.11.2005 14:35

дай свой xml который грузиться

unlexx 09.11.2005 14:40

точно :) надо дождаться загрузки :)

intro 09.11.2005 14:41

Вот XML который получается:
<?xml version="1.0" encoding="windows-1251" ?>
- <d>
- <data1>
<x>2</x>
<y>0</y>
<z>1</z>
</data1>
- <data2>
<x>1</x>
<y>2</y>
<z>3</z>
</data2>
- <data3>
<x>2</x>
<y>0</y>
<z>0</z>
</data3>
</d>

7thsky™ 09.11.2005 14:42

Цитата:

Сообщение от iNils
дай свой xml который грузиться

да все у него нормально грузиться, он просто не может понять
что вот для этого кода (который он пишет вне onLoad в том же кадре)

Код:

for (i=1; i<10; i++) {
trace(_global.xml_array[i].id);
}

массив _global.xml_array пустой так как xml еще не загрузился

intro 09.11.2005 14:43

Вот и я так думаю. Т.к. андифинет выводит раньше, чем заполняется массив.
Так как же всё таки дождаться загрузки ф-ции, а уж потом выводить массив на экран?

unlexx 09.11.2005 14:43

и с такой структурой ты делаешь доп массив?
ладно, делай setInterval или onEnterFrame
и проверяй переменную значение которой меняй по окончании заполнения массива


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

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