Преобразование входного текста в массив 2d

Я пытаюсь сделать редактор уровней для игры. Теперь я могу создать новую карту (с помощью мыши) и нажать кнопку «Создать», чтобы отследить массив карт (строка). После этого я могу просто скопировать код из вывода и использовать его для создания нового уровня.

Допустим, у меня есть класс NewLevel.as.

Я создаю новый массив и вставляю код из окна вывода, поэтому у меня есть 2d-массив. Затем добавьте плитки на сцену, используя циклы for.

var array:Array = 
// code below is what I get in output window
[ 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[7, 7, 7, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7],
[7, 7, 7, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7]
];

for (var row:int = 0; row < array.length; row++)
{
for (var column:int = 0; column < array[row].length; column++)
{
    var tile = new Tile();
    addChild(tile);
    tile.x = column * tile.width;
    tile.y = row * tile.height;
    tile.gotoAndStop(array[row][column] +1);
} 
}

Он работает без проблем, это дает мне карту, которую я создал с помощью редактора уровней. но я хочу, чтобы игроки вводили свой «код карты» и загружали карту, которую они создали. Я думаю, вы видели это во многих играх.

У меня есть текстовая область, поэтому пользователи могут вводить свою строку, как я могу преобразовать их ввод в массив 2d и загрузить его (как вы видите в примере)? Это должен быть 2d массив.

Я также добавил прослушиватель событий в текстовую область

textarea.addEventListener(Event.CHANGE, changes);

function changes(e:Event):void
{
    // convert input text to 2d array to build a new map

// Do not know how to get input to use with JSON
var myStr = levelTextarea.text;

var a2:Array = JSON.parse(myStr) as Array;
trace( a2 );
}

person User 987    schedule 04.02.2014    source источник
comment
Я также могу принять массив 1d, если вы покажете, как загрузить этот уровень.   -  person User 987    schedule 04.02.2014
comment
Просто вводите массивы как отдельные строки для каждого подмассива. Затем разделите ввод на \r\n и разделите каждую строку на ,.   -  person sberry    schedule 04.02.2014
comment
Я не понимаю функцию разделения, вы можете написать для нее код? И еще одна проблема: я не знаю, как сделать входной массив одной строкой, я могу обновить код, который вы видите, как я получил свой двумерный массив для ввода.   -  person User 987    schedule 04.02.2014


Ответы (1)


Вы можете использовать JSON для такого рода заданий, этот класс доступен в Flash Player 11.

package 
{
    import flash.display.Sprite;
    import flash.events.Event;

    /**
     * ...
     * @author 
     */
    public class Main extends Sprite 
    {

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point

            var a:Array = [ 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[7, 7, 7, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7],
[7, 7, 7, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7]
];

            var txt:String = JSON.stringify( a )
            trace( txt );

            var a2:Array = JSON.parse( txt ) as Array;
            trace( a2 );


        }

    }

}
person Nambew    schedule 04.02.2014
comment
Я никогда раньше не использовал JSON, но попробовал то, что вы говорите. На самом деле у меня нет массива: у меня есть только строка, которая выглядит как двумерный массив. Поэтому я попытался сделать array = JSON.parse(myString) as Array; и я получил эту ошибку: вызов возможно неопределенного метода синтаксического анализа через ссылку с классом статического типа. - person User 987; 05.02.2014
comment
Вы, вероятно, компилируете в версии SWF до 11. Что вы используете для компиляции? - person Nambew; 05.02.2014
comment
Да, извините, я забыл, что играл с другими настройками. Я сделал то, что вы говорите, и у меня есть ошибка Invalid JSON parse input. - person User 987; 05.02.2014
comment
Я обновлю свой первый пост, чтобы показать, что я пытаюсь сделать. - person User 987; 05.02.2014
comment
Какой именно текст вы вводите в текстовое поле? - person Nambew; 05.02.2014
comment
Это [[0,0,0,0], [0,0,0,0]], массив, которым вы описываете карту уровня, вы можете увидеть его в моем первом посте. - person User 987; 05.02.2014
comment
Я знаю, но вы ставите ; в конце TextArea вы добавляете лишний символ до или после []? - person Nambew; 05.02.2014
comment
Со мной очень сложно работать :) Я сделал то, что вы говорите, и получил массив, о котором вы говорите, но мой друг, это массив 1d, а не массив 2d, поэтому я не знаю, как построить карту и разместить тайлы на разных позиции, на правильных кадрах... Это то, что я сказал, когда комментировал свой первый пост. - person User 987; 05.02.2014
comment
С [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[7, 7,7,6,6,6,5,5,5,5,5,5,5,6,6,6,7,7,7,7],[7,7,7,6,6, 6,5,5,5,5,5,5,5,6,6,6,7,7,7,7]] JSON возвращает двумерный массив. - person Nambew; 05.02.2014
comment
Без шуток, я копирую и вставляю это в свое текстовое поле, делаю из него массив, и после трассировки я вижу это 0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,7,7,7,6,6,6,5,5,5,5,5,5,5,6,6,6,7,7,7 ,7,7,7,7,6,6,6,5,5,5,5,5,5,5,6,6,6,7,7,7,7 - person User 987; 05.02.2014
comment
Это нормально, трассировка возвращает строку, а не дамп переменной. Попробуйте trace(a2.length) и trace(a2[0] is Array); - person Nambew; 05.02.2014
comment
Аахаха, наконец-то я могу принять твой ответ, ты это заслужил. - person User 987; 05.02.2014
comment
Удачи тебе с твоим проектом. - person Nambew; 05.02.2014