Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   public массив (http://www.flasher.ru/forum/showthread.php?t=136458)

sltt 17.02.2010 18:10

public массив
 
Как можно создать public массив, чтоб его можно было изменять из других классов?

класс с массивом
Код AS3:

package myclass
{
 
        public class myglobal {
 
                public static const ww =700;
                public static const hh =700;
 
                public var enemyCrafts:Array;
 
                        public function initArrays()
                        {
                                enemyCrafts = new Array(10);
                        }
 
                        public function addCraft(...)
                        {
                                enemyCrafts.push(...);
                        }
 
}
 
}

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

package {
 
        import myclass.myglobal;
 
        public class screen extends Sprite {
                public function screen() {
 
                        myglobal.initArrays();
                        myglobal.addCraft(.....);
}
 
}
 
}

На что идет ответ:
1061: Call to a possibly undefined method initArrays through a reference with static type Class.
1061: Call to a possibly undefined method addCraft through a reference with static type Class.

proxiServer 17.02.2010 18:21

Вам нужно создать static массив. Вместо public напишите static.

А в вашем примере вы обращаетесь к классу, а методы и массив написали для экземпляра класса. Сделайте методы и массив статик и будет работать.

udaaff 17.02.2010 18:23

Не вместо, а вместе :)
И названия классов принято писать с большой буквы.

gloomyBrain 17.02.2010 18:24

Если объявить массив как static var, то к нему можно будет обратиться из любого места программы
Код AS3:

public class MyGlobal {
 
public static var array:Array;
 
public static function createArray() {
MyGlobal.array = new Array();
}
 
}

Обращение к данному массиву:
Код AS3:

public class MyClass {
 
public function MyClass() {
// ... конструктор
}
 
public function addArrayElement(element:/* Ну например*/ MovieClip ) {
 
if(MyGlobal.array == null) {
MyGlobal.createArray();
MyGlobal.array.push(element);
}
 
}
 
}


proxiServer 17.02.2010 18:27

udaaff, ну можно и вместо, но будет warning) ошибся.

sltt 18.02.2010 01:32

Это продолжение :-|
Я сначала тоже пробовал static но выбивало ошибку, теперь я понял из-за чего.
Проблема вот в чем получилась


Есть класс

Код AS3:

craftProperties.as
package {
        public class craftProperties{
 
                public var craftID:Number;
                public var craftColor:Number;
                public var craftType:Number;
 
        }
 
}


10 таких классов нужно сохранить в массив который находится в классе myglobal

Код AS3:

myglobal.as
package {
 
        import myclass.craftProperties;
 
        public class myglobal {
 
                public static const ww =700;
                public static const hh =700;
 
                public static var allCraftProperties:Array;/////<<<<<<<<<<
 
 
                        public static function initArrays()
                        {
                                allCraftProperties=new Array(10);
                        }
 
                        public static function addCraftProp(crfprop:craftProperties)
                        {
                                allCraftProperties.push(crfprop);
                        }
        }
}


Делаю я так:
Код AS3:

        import myglobal;
        import craftProperties;
 
        myglobal.initArrays();                       
 
        for (var i=0; i < 10 i++) {
                var crfpropEnemy:craftProperties=new craftProperties();
 
                crfpropEnemy.craftID=i;
                crfpropEnemy.craftType=1;
                crfpropEnemy.craftColor=0xFFFFFF;
 
                myglobal.addCraftProp(crfpropEnemy);
        }


А потом пытаюсь прочитать массив из 4-го класса

Код AS3:

craft.as
package {
 
        import flash.display.Sprite;
        import myclass.myglobal;
 
 
        public class craft extends Sprite {
 
 
                public function craft() {
 
                        trace(myglobal.allCraftProperties[1].craftType);
 
                }
        }
}

На что получаю
Код AS1/AS2:

        TypeError: Error #1010: Термин не определен и не имеет свойств.
        at сraft()

Что я неправильно сделал?

GentleFLASH 18.02.2010 03:31

Напиши так, возможно ситуация прояснится:

Код AS3:

craft.as
package {
 
        import flash.display.Sprite;
        import myclass.myglobal;
 
 
        public class craft extends Sprite {
 
 
                public function craft(){
 
                        trace("arr: " + myglobal.allCraftProperties);
                        trace("arr.length: " + myglobal.allCraftProperties.length);
                        trace("arr[1]: " + myglobal.allCraftProperties[1]);
 
                        trace(myglobal.allCraftProperties[1].craftType);
 
                }
        }
}

Если myglobal.allCraftProperties равен null или undefined - массив еще не инициализирован. Если myglobal.allCraftProperties.length равен нулю, то в массиве еще нет элементов.
Следовательно экземляр класса craft создается раньше, чем выполняется вот это:

Код AS3:

        import myglobal;
        import craftProperties;
 
        myglobal.initArrays();                       
 
        for (var i=0; i < 10 i++) {
                var crfpropEnemy:craftProperties=new craftProperties();
 
                crfpropEnemy.craftID=i;
                crfpropEnemy.craftType=1;
                crfpropEnemy.craftColor=0xFFFFFF;
 
                myglobal.addCraftProp(crfpropEnemy);
        }


Bgg 18.02.2010 14:16

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

Psycho Tiger 18.02.2010 15:38

Второе лучше.

Bgg 18.02.2010 16:16

Цитата:

Сообщение от Psycho Tiger (Сообщение 887609)
Второе лучше.

Да я догадываюсь :) Интересны причины этого "лучше".

Psycho Tiger 18.02.2010 16:31

Всякие левые классы не смогут получить доступ к этому массиву, а только те, которым он нужен - инкапсуляция тобишь + ООП, да и вдобавок код более хорош - может быть, вы захотите когда нибудь создать ещё 2 таких же объекта, но им будет нужен свой массив. Вариант со статиком накрывается сразу - не делать же 2 массива статики, это бред. Вам может потребоваться 40 таких.
Конечно, наверное вам в этом случае создавать 2 таких же не придется, однако придёт время - и у вас будет уже всё готово, потому что вы по привычки написали правильно.

sltt 19.02.2010 04:43

На
Цитата:

Сообщение от GentleFLASH (Сообщение 887477)
trace("arr: " + myglobal.allCraftProperties);
trace("arr.length: " + myglobal.allCraftProperties.length);
trace("arr[1]: " + myglobal.allCraftProperties[1]);

trace(myglobal.allCraftProperties[1].craftType);

Вот что выдало
Код AS1/AS2:

arr: ,,,,,,,,,,[object craftProperties]
arr.length: 11
arr[1]: undefined
TypeError: Error #1010: Термин не определен и не имеет свойств.


dixus 19.02.2010 15:03

Цитата:

Сообщение от sltt (Сообщение 887805)
Код AS1/AS2:

TypeError: Error #1010: Термин не определен и не имеет свойств.


У вас массив инициализируется с 10 элементами по умолчанию. Когда вы делаете push, добавляется 11-ый элемент, а первые 10 остаются undefined, замените
Код AS3:

new Array(10)

на
Код AS3:

new Array()

должно сработать

sltt 19.02.2010 23:03

OMG! Заработало! :eek:

Нужно было всего лиш пустой массив создавать
enemyCrafts = new Array();

Код AS1/AS2:

Всем спасибо!

Код AS3:

dixus - ты гений!

:yahoo:


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

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