apache-flex 动作脚本:使用多维数组

hwamh0ep  于 2022-11-01  发布在  Apache
关注(0)|答案(3)|浏览(150)

使用actionscript定义索引数组时遇到问题。
任务如下。我有一个点对象板。我需要将它们存储到一个数组中,这样我就可以简单地使用它的x,y坐标来访问每个点。例如,要获得点1,我希望能够使用points[1][1],等等。我在这里阅读了文档http://livedocs.adobe.com/flex/3/html/help.html?content=10_Lists_of_data_2.html,并意识到我不明白如何根据我的需要初始化数组。(特别是当它可以包含10到15行和列时,因此使用以下表示法将相当困难:masterTaskList[0] = [“洗碗”,“倒垃圾”];,如文件中所建议。)
我正在做的是:

for (var x:Number = 1; x<= boardSize; x++)
{
     for (var y:Number = 1; y<= boardSize; y++)
     {
    var stone:StoneSprite = new StoneSprite();
    stone.x = this.x + x*cellWidth;
    stone.y = this.y + y*cellWidth;
    stones[x][y] = stone;
     }
}

但它给了我一个错误:

RangeError: Index '1' specified is out of bounds.   at mx.collections::ListCollectionView/getItemAt()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\collections\ListCollectionView.as:422]    at mx.collections::ListCollectionView/http://www.adobe.com/2006/actionscript/flash/proxy::getProperty()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\collections\ListCollectionView.as:698]  at components::Board/placeStonesInNodes()[/Users/oleg/jin/goclub/trunk/goapp/usersList/src/components/Board.as:60]  at components::Board/creationComplete()[/Users/oleg/jin/goclub/trunk/goapp/usersList/src/components/Board.as:44]    at flash.events::EventDispatcher/dispatchEventFunction()    at flash.events::EventDispatcher/dispatchEvent()
ycl3bljg

ycl3bljg1#

我手边没有AS编译器,但我相信

for (var x:Number = 1; x<= boardSize; x++)
{
     stones[x] = new Array();
     for (var y:Number = 1; y<= boardSize; y++)
     {
        var stone:StoneSprite = new StoneSprite();
        stone.x = this.x + x*cellWidth;
        stone.y = this.y + y*cellWidth;
        stones[x][y] = stone;
     }
}

可能有用。
顺便问一句,你为什么从索引1开始循环呢?

ao218c7q

ao218c7q2#

Idd,你必须将stones[x]初始化为一个数组。例如,在C++中,你可以在一行中初始化一个二维数组(我认为是常量大小),但在AS中你不能。
如果你从索引0开始循环,你也可以使用push,但是它不会给Khilon的答案增加任何东西(如果你改变循环的起始索引,这有点危险)。

for (var x:Number = 0; x< boardSize; x++)
{
     stones.push(new Array());
     for (var y:Number = 0; y< boardSize; y++)
     {
        var stone:StoneSprite = new StoneSprite();
        stone.x = this.x + x*cellWidth;
        stone.y = this.y + y*cellWidth;
        stones[x].push(stone);
     }
}
0kjbasz6

0kjbasz63#

其他人是对的--您需要将数组初始化为Arrays。
我还要补充一点,因为您在填充这些数组之前就知道boardSize,所以您也应该使用该值,以避免使用Array.push带来的不必要的开销:

var points:Array = new Array(boardSize);

for (var i:uint = 0; i < points.length; i++)
{
    points[i] = new Array(boardSize);

    for (var j:uint = 0; j < boardSize; j++)
    {
        var s:StoneSprite = new StoneSprite();
        // Do your work on s...

        points[i][j] = s;
    }
}

然后,要以您描述的方式读取值,只需使用getter:

private function getStone(x:uint, y:uint):StoneSprite
{
    return points[x - 1][y - 1] as StoneSprite;
}

相关问题