2013-08-23 5 views
0

Я видел много потоков об этом, но моя проблема не решена. Это может быть простой способ, но я понятия не имею ...Как получить индекс объекта в массиве

Я пытаюсь получить индексы объектов в массиве таким образом:

var test:Array = new Array(); 

for (var row:Number = 0; row < 2; row++) { 
    test[row] = []; 
    for (var column:Number = 0; column < 3; column++) { 
     test[row][column].addEventListener(MouseEvent.CLICK, objClicked); 
     test[row][column] = new ballShape(column, column, row); 
     addChild(test[row][column]); 
    } 
} 

function objClicked(evt:MouseEvent):void { 
    // Here must return Object index in array 
} 

PS:

я могу получить items в массиве int, но я не знаю об объектах.

Любые идеи будут оценены.

Edit:

ballShape.as

package { 
    import flash.display.Graphics; 
    import flash.display.Sprite; 
    import flash.events.MouseEvent; 
    import fl.motion.Color; 

    public class ballShape extends Sprite { 

    private var shapeId:uint; 
    private var currentPosition:uint; 
    private var arrayPosition:uint; 
    private var color:Number; 

    public function ballShape(Id:uint, currPos:uint, arrPos:uint) { 
     setId(Id); 
     setArrayPos(arrPos); 
     setCurrentPos(currPos); 

     //trace("Array : " + arrPos); 
     //trace("Curr : " + currPos); 

     if (arrPos == 0) { 
      var posX:uint = 60; 
     } else { 
      var posX:uint = (arrPos + 1) * 60; 
     } 
     if (currPos == 0) { 
      var posY:uint = 42; 
     } else { 
      var posY:uint = (currPos + 1) * 42; 
     } 
     if (arrPos == 0) { 
      color = 0xFF0000; 
     } else { 
      color = 0x00FF00; 
     } 
     graphics.beginFill(color, 1.0); 
     graphics.drawCircle(posX, posY, 20); 
     graphics.endFill();  
     this.addEventListener(MouseEvent.CLICK, Clicked); 
    } 
    public function setId(Id:uint):void { 
     shapeId = Id; 
    } 
    public function getId():uint { 
     return shapeId; 
    } 
    public function Clicked(evt:MouseEvent):void { 
     //return getId(); 
     trace("Ball id is " + getId()); 
     trace("Array id is " + getArrayPos()); 
     trace("PositionInArray id is " + getCurrentPos()); 
     //return arrayPosition;  
    } 
    public function setCurrentPos(Pos:uint):void { 
     currentPosition = Pos; 
    } 
    public function getCurrentPos():uint { 
     return currentPosition; 
     trace(currentPosition); 
    } 
    public function setArrayPos(arrayPos:uint):void { 
     arrayPosition = arrayPos; 
    } 
    public function getArrayPos():uint { 
     return arrayPosition; 
     trace(arrayPosition);  
    } 
    public function addBead(arrayId, currPos):void { 

    } 
} 

} 
+0

Вы хотите, чтобы получить индекс, что объект имеет в массиве? Я не думаю, что вы можете получить это таким образом. Вы можете получить childindex из родительского, но не значения 'row' и/или' column' – putvande

+0

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

+0

Проблема в том, что у вас многомерный массив. Поэтому вам, по крайней мере, нужно будет прокручивать каждую строку, а затем использовать indexOf(), чтобы возвращать столбец внутри строки. Таким образом, у вас будет не только один индекс, но два. Там могут быть более эффективные способы достижения этого, например, поместить каждую строку в Sprite, а затем получить дочерний индекс внутри родителя. –

ответ

2

Я предложил бы добавить rowcolumn и в качестве общественных переменных в ballShape классе. Таким образом, вы можете получить их, как это:

function objClicked(evt:MouseEvent):void { 
    trace(ballShape(evt.target).getCurrentPos(), ballShape(evt.target).getArrayPos()); 
} 

Может превратить эти две линии вокруг:

test[row][column].addEventListener(MouseEvent.CLICK, objClicked); 
test[row][column] = new ballShape(column, column, row); 

быть:

test[row][column] = new ballShape(column, column, row); 
test[row][column].addEventListener(MouseEvent.CLICK, objClicked); 
+0

Я пробовал ваш подход, но получаю эту ошибку 'Доступ к возможно неопределенной строке свойств через ссылку со статическим типом ballShape.' Какие-нибудь идеи? –

+0

Я изменил свой ответ, так как у вас есть публичные функции, чтобы получить строку и столбец из вашего собственного класса. – putvande

+0

Благодарим вас за ответ. Ошибка изменилась на этот 'TypeError: Error # 1010: Термин не определен и не имеет свойств. \t at ballShape_fla :: MainTimeline/frame1() '. –

0

Попробуйте что-то вроде:

protected function objClicked(e:MouseEvent):void { 
    for (var row: int=0; row < test.length; row++) { 
     var column:int = (test[row] as Array).indexOf(e.currentTarget);//use currentTarget so you don't try to match on internal Interactive Objects! 
     if (column>-1) { 
      trace(row, column); 
      return;//or break, if you need to do something else below this loop 
     } 
    } 
}
Смежные вопросы