2013-08-23 86 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:

我能得到物品索引int數組,但我不知道物體。

任何想法,將不勝感激。

編輯:

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

你想要得到的索引對象具有在數組中?我認爲你不能這樣做。您可以從父級獲取子索引但不包含「行」和/或「列」值 – 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:錯誤#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 
     } 
    } 
}
相關問題