Форум 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)
Второе лучше.

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


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

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