Actionscript 3 Ссылка на публичную статическую переменную в массиве не работает - PullRequest
0 голосов
/ 25 февраля 2010

Я устанавливаю класс общедоступных статических переменных, которые должны быть BitmapData.

Проблема, с которой я столкнулся, заключается в том, что я не могу динамически ссылаться на переменные в массиве, что делает невозможным присвоение им значений без серьезного процедурного кодирования.

Вот как это выглядит

package com.myPackage{

  import flash.display.*;
  import flash.events.*;
  import flash.net.*;

    public class Images extends Sprite{

       private var url1:String = "http://www.mydomain.com/myImage.jpg";
       private var url2:String = "http://www.mydomain.com/myImage2.jpg";

       public static var IMAGE_ONE_BDATA:BitmapData;
       public static var IMAGE_TWO_BDATA:BitmapData;

       private var urlArray = new Array(url1,url2);
       private var bDataArray = new Array(IMAGE_ONE_BDATA, IMAGE_TWO_BDATA);
       private var count:int = 0;

       public function Images(){
         initLoader();
       }

       private function initLoader():void
       {
          if(count < urlArray.length){
            var url:String = urlArray[count];
            var loader:Loader = new Loader();
            loader.load(new URLRequest(url));
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function (e:Event):void{
            bDataArray[count] = e.target.content.bitmapData;
            trace(IMAGE_ONE_BDATA) // <-- this should trace ([object-bitmapdata]) but instead returns null.. this is where I have to make a direct reference like..
            IMAGE_ONE_BDATA = e.target.content.bitmapData;
            trace(IMAGE_ONE_BDATA) // <-- will now return my bitmapdata object

            count++;
            initLoader();
           }else{
            dispatchEvent(new ImagesLoadedEvent);
       }
    }
 }  

Должен ли я считать, что мой массив является частной переменной, а размещение ссылок на общедоступные статические переменные недопустимо? Кто-нибудь вызовет на меня полицейскую полицию?
Любой вклад высоко ценится.

-Jascha

Ответы [ 3 ]

1 голос
/ 25 февраля 2010

Вы немного неправильно понимаете, что такое переменные. Они не объекты, это ссылки на объекты.

Позвольте мне попытаться объяснить, проведя вас через ваш код:

Итак, эти две переменные являются локальными только для экземпляра Images и ссылаются на две заданные вами строки:

private var url1:String = "http://www.mydomain.com/myImage.jpg";
private var url2:String = "http://www.mydomain.com/myImage2.jpg";

Теперь вы определяете две переменные, но не присваиваете им никаких значений, поэтому на данный момент они пусты или в AS3 "null":

public static var IMAGE_ONE_BDATA:BitmapData;
public static var IMAGE_TWO_BDATA:BitmapData;

Теперь вы создаете новый массив и передаете в него два объекта, на которые ссылаются url1 и url2. Обратите внимание, что вы не храните две переменные, вы храните объекты, на которые ссылаются эти переменные. Более того через минуту:

private var urlArray = new Array(url1,url2);

так что теперь, если вы измените url1 на "hello url1" и отследите urlArray, у вас все еще будут две ссылки в массиве.

Если все это имеет смысл, то, надеюсь, вы увидите, что здесь произойдет:

private var bDataArray = new Array(IMAGE_ONE_BDATA, IMAGE_TWO_BDATA);

вы не прикрепили никаких объектов к IMAGE_ONE_BDATA или IMAGE_TWO_BDATA; они по-прежнему равны нулю, поэтому вы передаете нуль в массив дважды. Позже, если вы назначите объект IMAGE_ONE_BDATA, вы не назначите его массиву, только этой переменной.

Теперь вы присвоили битовые данные массиву, но не IMAGE_ONE_BDATA. Ваши ожидания неверны, он должен возвращать ноль:

    bDataArray[count] = e.target.content.bitmapData;
    trace(IMAGE_ONE_BDATA) // <-- this _should_ trace null

Далее вы ссылаетесь на bitmapData на IMAGE_ONE_BDATA, так что теперь у него есть ссылка

     IMAGE_ONE_BDATA = e.target.content.bitmapData;
     trace(IMAGE_ONE_BDATA) // <-- will now return my bitmapdata object

Ошибка в том, что IMAGE_ONE_BDATA следует рассматривать как объект, в который вы помещаете bitmapData, а не как имя в заметке post-it, которую вы прикрепляете к объектам, когда хотите их отслеживать. Сам растровые данные - это интересующий вас объект, а не имя.

Если вам нужно, чтобы ваши растровые данные были общедоступными и статичными, забудьте ваши IMAGE_ONE_BDATA и IMAGE_TWO_BDATA и определите:

public static var bDataArray:Array

вместо.

Надеюсь, это поможет - нет полиции Флэш. :)

0 голосов
/ 25 февраля 2010

К сожалению, AS3 не позволяет вам создавать такие объекты. Вы всегда можете сделать это, хотя:

public static var bDataNameArray:Object = new Object();
bDataNameArray["MY_AWESOME_UPPERCASE_NAME"] = e.target.content.bitmapData;

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

var data:BitmapData = Images.bDataNameArray["MY_AWESOME_UPPERCASE_NAME"];
var bitmap:Bitmap = new Bitmap(data);

Надеюсь, это все поможет. Удачи.

0 голосов
/ 25 февраля 2010

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

вне цикла я переименую bDataArray в bDataNameArray. и объявить другой открытый статический массив переменных bDataObjects.

затем внутри цикла

var bDataNameArray[i]:Object = new Object();
bDataNameArray[i].bData = e.target.content.bitmapData;
bDataObjects.push(bDataNameArray[i]);

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

var bitmap:Bitmap = new Bitmap(Images.bDataObjects.IMAGE_ONE_DATA.bData);

или я могу просто придерживаться обычного имени для объектов. как ob: Object = new Object () ... но как это скучно?

-J

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...