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
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
{
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
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
ContentImporterContext context)
{
FileStream stream = File.OpenRead(filename);
StreamReader reader = new StreamReader(stream);
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
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>(filename);
Boolean[,] map = ListString2MatrixBoolean(buffer);
return new Map(this.scene, map);
}
public Boolean[,] ListString2MatrixBoolean(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