actionscript: использование многомерных массивов - PullRequest
1 голос
/ 25 октября 2009

У меня проблемы с определением индексированного массива с помощью Actionscript.

Задача следующая. У меня есть доска точечных объектов. Мне нужно хранить их в одном массиве, чтобы я мог получить доступ к каждой точке, просто используя ее координаты x, y. например, чтобы получить первую точку, я хочу использовать точки [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()

Ответы [ 3 ]

1 голос
/ 25 октября 2009

Странно, вы должны инициализировать камни [x] как массив. Например, в C ++ вы можете инициализировать двумерный массив в одну строку (с постоянным размером, я думаю), но в AS вы не можете.

Если вы начнете цикл с индекса 0, вы также можете использовать push, но это ничего не добавляет к ответу Хилона (+ это немного опасно, если вам когда-нибудь нужно изменить начальный индекс циклов).

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);
     }
}
1 голос
/ 25 октября 2009

У меня нет компилятора 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?

0 голосов
/ 26 октября 2009

Остальные правы - вам нужно инициализировать ваши массивы как массивы.

Я бы также добавил, что, поскольку вы знаете 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;
    }
}

Затем, чтобы прочитать значения так, как вы описываете, просто используйте геттер:

private function getStone(x:uint, y:uint):StoneSprite
{
    return points[x - 1][y - 1] as StoneSprite;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...