AS3: ссылка на mc из массива для последующего назначения дополнительных свойств массива - PullRequest
0 голосов
/ 15 октября 2010

У меня есть несколько «предметов» (mc), содержащихся в прокручиваемом mc, которые можно перетаскивать на другие соответствующие mc.Имена элементов перечислены в массиве, и я хочу назначить переменные пригодности и обратную связь для каждого mc из массива.Я думаю, что это называется ассоциативный массив?

Возникли проблемы с правильной ссылкой на элементы из массива.Чтобы объяснить, вот рабочий скрипт с простым массивом и неэффективным обходным путем:

var itemArray:Array = new Array("ball","box","hex");  //only a few items in this prototype
scrollitems.ball.ifeedback = "Woo... hoo...";
scrollitems.box.ifeedback = "Great!";
scrollitems.hex.ifeedback = "Oops!";
scrollitems.ball.isuitable = true;
scrollitems.box.isuitable = true;
scrollitems.hex.isuitable = false;

for (var i:int=0; i<itemArray.length; i++)
{
   var itemname:String = String(itemArray[i]);
   var curritem:MovieClip = MovieClip(scrollitems.getChildByName(itemname));
   if (curritem != null)
   {
     curritem.startX = curritem.x;
     curritem.startY = curritem.y;
     curritem.addEventListener(MouseEvent.MOUSE_DOWN, pickUp);
     curritem.addEventListener(MouseEvent.MOUSE_UP, dropIt);
     curritem.buttonMode = true;
   }
}

Вот потенциально лучший скрипт, использующий ассоциативный массив, но он не работает согласно комментариям CAP ...

var itemArray:Array = new Array[{iname:"ball",isuitable:true,ifeedback:"Well done!"},
     {iname:"box",isuitable:true,ifeedback:"Great!"},
     {iname:"hex",isuitable:false,ifeedback:"Oops!"}];
for (var i:int=0; i<itemArray.length; i++)
{
   var itemname:String = String(itemArray[i].iname); // THIS DOESNT WORK - ITEMNAME IS A STRING BUT CANT ASSIGN INAME TO THIS STRING??
   var curritem:MovieClip = MovieClip(scrollitems.getChildByName(itemname));
   if (curritem != null)
   {
     curritem.startX = curritem.x;
     curritem.startY = curritem.y;
     curritem.isuitable= curritem.isuitable;  //NOT WORKING - HOW TO ASSIGN THIS??
     curritem.ifeedback = curritem.ifeedback;  // NOT WORKING - HOW TO ASSIGN THIS??
     curritem.addEventListener(MouseEvent.MOUSE_DOWN, pickUp);
     curritem.addEventListener(MouseEvent.MOUSE_UP, dropIt);
     curritem.buttonMode = true;
   }
}

Есть предложения для новичка AS3?

Ответы [ 4 ]

0 голосов
/ 16 октября 2010

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

var itemArray:Object = {  
item1:{iname:"ball", isuitable:true,  ifeedback:"Great!"},
item2:{iname:"box",  isuitable:false, ifeedback:"No, not that one!"}
} 

for (var i:int = 1;i < 3;i++) {
    var itemname:String = String(itemArray["item"+i].iname);
    var curritem:MovieClip = MovieClip(scrollitems.getChildByName(itemname));

    if (curritem != null)
    {
       curritem.isuitable = itemArray["item"+i].isuitable;
       curritem.ifeedback = itemArray["item"+i].ifeedback;
       curritem.startX = curritem.x;
       curritem.startY = curritem.y;

       curritem.addEventListener(MouseEvent.MOUSE_DOWN, pickUp);
       curritem.addEventListener(MouseEvent.MOUSE_UP, dropIt);
       curritem.buttonMode = true;
    }
}
0 голосов
/ 16 октября 2010

Код не работает, потому что есть неправильные типы скобок. Это должно быть new Array(), а не new Array[]. См. Массив и Доступ к массиву .

Кроме того, вы получаете значения isuitable и ifeedback, как вы это сделали с iname: itemArray[i].isuitable и itemArray[i].ifeedback.

0 голосов
/ 16 октября 2010

var itemArray:Array = [{iname:"ball",isuitable:true,ifeedback:"Well done!"},
     {iname:"box",isuitable:true,ifeedback:"Great!"},
     {iname:"hex",isuitable:false,ifeedback:"Oops!"}];
 for (var i:int=0; i < itemArray.length; i++)
 {
     var itemname:String = itemArray[i].iname; 
     var curritem:MovieClip = MovieClip(scrollitems.getChildByName(itemname));

     if (curritem != null)
     {
       curritem.startX = curritem.x;
       curritem.startY = curritem.y;
       curritem.isuitable= itemArray[i].isuitable;
       curritem.ifeedback = itemArray[i].ifeedback;

       curritem.addEventListener(MouseEvent.MOUSE_DOWN, pickUp);
       curritem.addEventListener(MouseEvent.MOUSE_UP, dropIt);
       curritem.buttonMode = true;
     }

}

0 голосов
/ 15 октября 2010

AS3 не имеет ассоциативных массивов как таковых. У него есть Objects, базовый класс всего, что вы можете использовать как ассоциативные массивы:

var itemArray:Object = { 
    property1:"value", 
    property2:{ 
        subProperty1:"subValue", 
        subProperty2:{ //more nested objects ad infinitum }
    } 
};

Вы можете получить доступ к этим объектам и свойствам несколькими способами:

trace( itemArray.property1 );
trace( itemArray.property2.subProperty1 );

или

trace( itemArray["property1"] );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...