Pelo que estou estudando, entendi que ateh consigo ler arquivos externos ao programa usando a classe StreamReader, mas quando o build do projeto for feito vai ter dependência que o arquivo exista fora do executável e não tenho a menor idéia de como referenciar o sistema de arquivo do Xbox por exemplo.

Assim sendo tem a tal da pasta content no projeto do jogo, dando add em itens nesta pasta, eles podem ser carregados pelo ContentManager !! mor legal.

No meu caso preciso carregar arquivos de mapa que gerei que contém um monte de zeros e uns, algo do tipo :

111111111111111111111111111111
100000000001100000000000000001
101111111111101111111111111101
101111111111101111111111111101
100000000001100001100001100001
101111111101111101101101101111
101111111101111101101101101111
100000001101100001101101100001

entaum seguindo alguns tutoriais, entendi que precisava escrever um contentimporter, para que o xna soubesse como transformar meu belo arquivo em objetos usaveis.

segui o tutorial e criei um Content PipeLine Extension Library dentro da mesma solution do jogo

e criei a classe MapFilesImporter

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Content.Pipeline;
using Microsoft.Xna.Framework.Content.Pipeline.Graphics;
using Microsoft.Xna.Framework.Content.Pipeline.Processors;

using Microsoft.Xna.Framework.Content.Pipeline.Serialization.Compiler;
using Microsoft.Xna.Framework.Content;

using System.IO;

namespace MapFilesContentPipeLine
{
[ContentImporter(".maze", DisplayName = "Map Files - ChikenMaze")]
public class MapFilesImporter : ContentImporter
{

public override Boolean[,] Import(string filename,
ContentImporterContext context)
{
FileStream stream = File.OpenRead(filename);
StreamReader reader = new StreamReader(stream);
List> buffer = new List>();

string line = reader.ReadLine();
while (line != null)
{

List bufferLine = new List();
foreach (char one in line)
{
bufferLine.Add(one == ’1′ ? true : false);
}
buffer.Add(bufferLine);
line = reader.ReadLine();
}

Boolean[,] result = new Boolean[buffer.Count, buffer[0].Count];
int row = 0;
int col = 0;

// copy data to the matrix
foreach (List onelist in buffer)
{
foreach (Boolean spot in onelist)
{
result[row, col] = spot;
col++;
}
row++;
col = 0;
}

return result;
}

}
}

Lembrando é claro de fazer referência ao projeto to content pipeline tanto no projeto do jogo, quanto nas referências da pasta content, isto me rendeu um tempão para perceber … hehehehe

dai tive a surpresa legal …
Error 1 Building content threw RankException: Cannot serialize multidimensional arrays.
po custava saber serializar arrays multidimensionais ?? =)

bem vou ter que mudar um pouco a estratégia de carregar os mapas, jah vi que vou precisar de um tipo de dados mais simplim que um array multidimensional de booleanos, pow mais simples que isso !! hehehehe, vou criar algo do tipo MapDefinition com as strings das linhas e um método para transformar na famigerada matriz de booleanos.

então refiz a classe de importar o formato de arquivo que tenho, novinha em folha !
comparando com a anterior, nesta mudei o display name para poder verificar se estava usando a nova implementação (danado desconfiado huahuahuuah) e passei a retornar List para os intimos conhecida como lista de tamanho variável de string.

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Content.Pipeline;
using Microsoft.Xna.Framework.Content.Pipeline.Graphics;
using Microsoft.Xna.Framework.Content.Pipeline.Processors;

using Microsoft.Xna.Framework.Content.Pipeline.Serialization.Compiler;
using Microsoft.Xna.Framework.Content;

using System.IO;

namespace MapFilesContentPipeLine
{
[ContentImporter(".maze", DisplayName = "Map Files - ChikenMaze (List)")]
public class MapFilesImporter : ContentImporter>
{

public override List Import(string filename,
ContentImporterContext context)
{
FileStream stream = File.OpenRead(filename);
StreamReader reader = new StreamReader(stream);
List buffer = new List();

string line = reader.ReadLine();
while (line != null)
{
buffer.Add(line);
line = reader.ReadLine();
}

return buffer;
}

}
}

com esta novidade precisei alterar um pouco a classe que gerencia os mapas para poder converter de List para Boolean[,] olha como ficou o trecho que carrega o mapa e o conversor de um tipo para o outro.

public Map getMap(int level)
{
// ok ok in one line would be cooler =)
// Boolean[,] map = ListString2MatrixBoolean(scene.game.Content.Load>(getMapName(level)));
//
// but this way we can read easily at 4:30AM
//
string filename = getMapName(level);
List buffer = scene.game.Content.Load>(filename);
Boolean[,] map = ListString2MatrixBoolean(buffer);
return new Map(this.scene, map);
}

public Boolean[,] ListString2MatrixBoolean(List list)
{
Boolean[,] result = new Boolean[list.Count, list[0].Length];
int row = 0;
int col = 0;

foreach (string line in list) {
foreach (char one in line)
{
result[row, col] = (one == ’1′ ? true : false);
col++;
}
row++;
col = 0;
}

return result;
}

ultimo comentario para os desesperados que leram até o final, uma pena que minha mãe não programa em c# !! ela estaria lendo tudinho !! huahuahuhua

quando fizer referência ao arquivo a ser carregado nao inclua a extensão, eu estava buscando por maze_10_10.maze e recebendo o erro de “file not found”, resolvi fazer do mesmo jeito que estava fazendo com os arquivos de imagens e todos ficaram felizes, basta uasr o nome sem extensão.

olha que bela imagem da galinha andando num mapa carregado do arquivo !!

link para os tutoriais

Custom Content Importer with XNA 2.0
http://www.ziggyware.com/readarticle.php?article_id=166

Using a Custom Importer or Content Processor
http://msdn.microsoft.com/en-us/library/bb447743(XNAGameStudio.20).aspx