PDA

Просмотр полной версии : парсинг game_map из xml


DanQuimby
17.02.2011, 10:40
Доброе утро, у меня есть вопрос, как лучше представлять игровую карту
которая находиться в xml файле.
У меня на данный момент сделано так

<?xml version="1.0" encoding="utf-8" ?>
<!-- потом сюда закину типы щас просто для теста с 1 обьектом -->
<data>
<map>
11111111111111
10000000000001
10000111000001
10011011000001
10000011000001
10000011000001
10000011000001
10000011000001
10000000000001
11111111111111
</map>
</data>


то есть каждая <map> это String
но я так и не понял, как можно перебрать каждый символ в стринге.
Или как мне сделать, что бы на выходе я получал Array<uint>

разборка ...


private function _loaded_xml(e:Event):void
{
var _xml:XML = new XML(_loader.data);
var _uNum_Total_maps:uint = _xml.number_of_map;
var _result:String;
var _uCount_maps:uint = 1;
_xml.ignoreWhitespace = true;

for each (var maps:XML in _xml.map) {
if (_uCount_maps == _num_maps) {// найдена тот лабиринт который нужен

_result = maps.toString();
trace("map №" + _uCount_maps + "\n" + maps.toString());
}
_uCount_maps++;
}
}

wvxvw
17.02.2011, 11:21
А зачем XML для таких вещей? У вас каждая строчка - 14 байт, а если бы вы записывали это как числа, то можно было бы по 2 байта на строчку, еще бы 2 бита оставалось :)
Ну а конкретно для такой задачи - что-то в таком духе :)
package
{
import flash.display.Sprite;

/**
* ...
* @author wvxvw
*/
public class TestParseMap extends Sprite
{

public function TestParseMap()
{
super();
var map:String =
<![CDATA[11111111111111
10000000000001
10000111000001
10011011000001
10000011000001
10000011000001
10000011000001
10000011000001
10000000000001
11111111111111]]>.toString();
this.parseMap(map, this.createOnes, this.createZeros);
}

private function parseMap(input:String,
createOnes:Function /* int->int->void */,
createZeros:Function /* int->int->void */):void
{
var current:int;
var currentChar:String;
var inputLength:int = input.length;
var rows:int;
var colums:int;

while (current < inputLength)
{
currentChar = input.charAt(current);
trace(currentChar.charCodeAt());
switch (currentChar)
{
case "1": createOnes(current - colums, rows);
break;
case "0": createZeros(current - colums, rows);
break;
case "\r":
rows++;
colums = current + 1;
break;
default: colums++;
}
current++;
}
}

private function createOnes(collums:int, rows:int):void
{
super.graphics.beginFill(0xFF);
super.graphics.drawRect(collums * 20, rows * 20, 20, 20);
super.graphics.endFill();
}

private function createZeros(collums:int, rows:int):void
{
super.graphics.beginFill(0xFF00);
super.graphics.drawCircle(collums * 20 + 10, rows * 20 + 10, 10);
super.graphics.endFill();
}
}
}

DanQuimby
17.02.2011, 11:46
это было бы лучше , если бы у меня было только 2 обьекта
а их будет минимум 10
и как парсер сделать ? мона поподробней

GBee
17.02.2011, 12:14
Ну вы даете, вам же разжевали подробней некуда. Их и будет максимум 10 с такой организацией :о).

Добавлено через 2 минуты
Хотя, погорячился, еще буквы есть и спецсимволы

DanQuimby
17.02.2011, 12:19
Ну вы даете, вам же разжевали подробней некуда. Их и будет максимум 10 с такой организацией :о).

Добавлено через 2 минуты
Хотя, погорячился, еще буквы есть и спецсимволы
ну хорошо , а как пропарсить мне этот массив , если допустим этот путь истины.

GBee
17.02.2011, 12:48
ну хорошо , а как пропарсить мне этот массив , если допустим этот путь истины.
wvxvw все написал, либо я не понимаю что вы хотите.


2wvxvw, а зачем вы передаете функции как параметры?

DanQuimby
17.02.2011, 14:02
wvxvw все написал, либо я не понимаю что вы хотите.


2wvxvw, а зачем вы передаете функции как параметры?

ой ступанул )) вниз не пролистал :) ... я так делаю , потому что не знаю , как лучше
сделать когда все загружено. про другие методы просто не слышал.

Добавлено через 11 минут
wvxvw все спасибо, вопросов больше по этой теме нет :)

wvxvw
17.02.2011, 21:20
GBee: Мне так удобно :) Хотя, вцелом, ето не совсем тру путь в AS3, т.как по дороге теряется типизация. В том же HaXe она бы не потерялась.

DanQuimby: Если значений будет больше чем 1 и 0, то свитч логично заменить каким-нибудь мапом / массивом колбеков. Т.е. получится что-то в роде:

function parse(data:String, callbacks:Callbacks):void
{
var callback:Function;
while (...)
{
callback = callbacks.get(currentChar);
callback(x, y);
}
}

DanQuimby
19.02.2011, 19:30
GBee: Мне так удобно :) Хотя, вцелом, ето не совсем тру путь в AS3, т.как по дороге теряется типизация. В том же HaXe она бы не потерялась.

DanQuimby: Если значений будет больше чем 1 и 0, то свитч логично заменить каким-нибудь мапом / массивом колбеков. Т.е. получится что-то в роде:

function parse(data:String, callbacks:Callbacks):void
{
var callback:Function;
while (...)
{
callback = callbacks.get(currentChar);
callback(x, y);
}
}

ну как я понял класс Callbacks это лично ваш , и как я понял это класс "фабрики классов" ???
Ну а про свитч я тоже думаю что мона его не делать , иногда в нем путаешься , а фабрика будет получше