Добавить динамические экземпляры MovieClips в массив - PullRequest
1 голос
/ 30 августа 2010

Я пытаюсь добавить экземпляр мувиклипа в массив. Внутри House Class есть свойство HouseObjects. Внутри этого массива я создал класс Comp и Light. MovieClips динамически размещаются на сцене через связь. MovieClips также действуют как «кнопки переключения». Если состояние кнопки ВКЛ, значение равно 1. Если состояние кнопки если ВЫКЛ, значение равно 0.

Если значение равно 1, я пытаюсь добавить экземпляр MovieClip в массив onList. Внутри этого массива будут все экземпляры с включенным состоянием кнопки.

Я создал свойство с именем objSelect.

var objSelect:Object;

Эта переменная содержит выбранную currentTarget. Я пытаюсь передать его в function trackItems, чтобы либо выдвинул, либо выдвинул его в массив onList, основываясь на статусе кнопки.

Я получаю сообщение об ошибке для этой строки: onList.pop (objSelect); Неверное количество аргументов. Ожидается не более 0.

     public class House extends MovieClip 

    {

        var HouseObjects:Array = new Array();
    var onList:Array = []; // instances added to this array that have a bstatus ON
        var power:int; // holds value of individual House Objects
        var bstate:int; // 0 or 1 (ON or OFF)
        var bstatus:int;
        var userInput:int; // stores user data (of selected data); 
        //holds value of e.currentTarget.power

        var currentPower:int; // stores current power
            var objSelect:Object;

        public function House() 
        {
        // Instances are MovieClip "toggle buttons"
        HouseObjects[0] = new Comp(); // creates instance of Comp 
        HouseObjects[1] = new Light(); // creates instance of Light 
        }

         function toggleClick(e:MouseEvent) {
            // go to appropriate frame
      if (e.currentTarget.currentFrame == 2)
       {
        e.currentTarget.gotoAndStop(3);
        e.currentTarget.bstate = 1;
       }

       if (e.currentTarget.currentFrame == 4)
       {
        e.currentTarget.gotoAndStop(1);
        e.currentTarget.bstate = 0;
       } 

          bstatus = e.currentTarget.bstate;
          objName = e.currentTarget.name;

        trackItems(objSelect, bstatus); 


  } // end of function toggle click



  function trackItems(objSelect:Object, bstatus:int):void 
  {
     if (bstatus == 0) {
        // remove objSelect from Array onList 

     } else if (bstatus == 1) {
        onList.push(objSelect);
        //add to Array onList       
     }   

 }

 // function called when user clicks on update button
 function updateStage():void
 {
    for (var i:int = 0; i<=onList.length;i++) { 
    addChild(onList[i]);
    }

 }

}

Ответы [ 5 ]

1 голос
/ 30 августа 2010

Вам не нужно зацикливаться на массиве, чтобы найти удаляемый элемент, просто используйте метод indexOf:

var index:int = onList.indexOf(objSelect); 
onList.splice( index , 1 );

Я бы предложил добавить только имя объекта вOnList Array, это делает сравнение более простым и менее подверженным ошибкам

//if the button status is On
onList.push(objSelect.name);

//if the button status is Off
var index:int = onList.indexOf(objSelect.name); 
onList.splice( index , 1 );

, тогда вы можете обновить этап следующим образом:

function updateStage():void
{
   for (var i:int = 0; i<=HouseObjects.length;i++) 
  { 
     //if the onList Array contains the current name
     if( onList.indexOf(HouseObjects[i].name) != -1 ) 
           addChild(HouseObjects[i]);
  }

}
1 голос
/ 30 августа 2010

Создана функция, которая находит элемент, который необходимо удалить, и передает его в objSelect.Когда предмет был найден, тогда использовали splice ().

  function trackItems(objSelect:Object, bstatus:int):void 
 {
     if (bstatus == 0) {
        //remove instance from onList array     
        // call function removeArrayItem
        removeArrayItem(objSelect);

     } else if (bstatus == 1) {
        //remove instance from onList array     
        onList.push(objSelect);
     }   
 }

 function removeArrayItem(objSelect:Object):void
{
        var arrayLength:int = onList.length;

        // Loop through array to find item that needs to be removed
        for (var i:int=0; i<arrayLength; i++)
        {
            if (onList[i] == objSelect)
            {
               onList.splice(i, 1);
            }
        }

}
1 голос
/ 30 августа 2010

http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/Array.html#pop%28%29

Pop удаляет последний элемент из массива, если вы хотите удалить определенный элемент, используйте Array.splice с deleteCount == 0.

0 голосов
/ 30 августа 2010

мой совет - использовать более продвинутые коллекции, такие как
http://livedocs.adobe.com/flex/3/langref/mx/collections/ArrayCollection.html#methodSummary

вот модифицированный код:

public class House extends MovieClip 

{

    var HouseObjects:Array = new Array();
var onList:ArrayCollection = new ArrayCollection(); // instances added to this array that have a bstatus ON
    var power:int; // holds value of individual House Objects
    var bstate:int; // 0 or 1 (ON or OFF)
    var bstatus:int;
    var userInput:int; // stores user data (of selected data); 
    //holds value of e.currentTarget.power

    var currentPower:int; // stores current power

    public function House() 
    {
    // Instances are MovieClip "toggle buttons"
    HouseObjects[0] = new Comp(); // creates instance of Comp 
    HouseObjects[1] = new Light(); // creates instance of Light 
    }

     function toggleClick(e:MouseEvent) {
        // go to appropriate frame
  if (e.currentTarget.currentFrame == 2)
   {
    e.currentTarget.gotoAndStop(3);
    e.currentTarget.bstate = 1;
   }

   if (e.currentTarget.currentFrame == 4)
   {
    e.currentTarget.gotoAndStop(1);
    e.currentTarget.bstate = 0;
   } 

      bstatus = e.currentTarget.bstate;
      objName = e.currentTarget.name;

    trackItems(objSelect, bstatus); 


  } // end of function toggle click



  function trackItems(objName:Object, bstatus:int):void 
  {
     if (bstatus == 0) {
        onList.removeItemAt(onList.getItemIndex(objName));
        // remove from onList 

     } else if (bstatus == 1) {
        onList.addItem(objName);
        //add to onList       
     }   

 }

 // function called when user clicks on update button
 function updateStage():void
 {
    for (var i:int = 0; i<=onList.length;i++) { 
    addChild(onListgetItemAt(i));
    }

 }
0 голосов
/ 30 августа 2010

pop удаляет последний элемент массива.если вы хотите удалить данный элемент, вам нужно сместить хвост массива вверх в положение элемента, который вы хотите удалить

...