2013-08-23 56 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 
     } 
    } 
}
相关问题