Tile クラスの配列を使用して情報を格納する Tilemap エンジンを作成しようとしています。これらの Tile クラスは、テクスチャ インデックスとアーティファクト インデックスを含む 8 つの情報 (すべて数値) を格納しますが、これらの配列の保存と読み込みに関しては、特に読み込みに数分かかる場合がある読み込みに時間がかかる場合があります。 100x100 などのはるかに大きなサイズの配列。現在、テキスト ファイルを使用して情報を保存し、さまざまなタイルをスペースで区切り、それらのタイルのさまざまな情報をカンマで区切り、StreamReaders と StreamWriters を使用してこれらを読み取ります。
public void Load()
{
try
{
TextReader TR = new StreamReader("C:/Users/Cogythea/Documents/Programming TextFiles/TileMap.tilemap");
TR.Close();
StreamReader reader = new StreamReader("C:/Users/Cogythea/Documents/Programming TextFiles/TileMap.tilemap");
List<string[]> stringLists = new List<string[]>();
int arrayArea;
int lineLength = 0;
int arrayHeight = 0;
int width;
string line;
while ((line = reader.ReadLine()) != null)
{
lineLength = line.Length;
arrayHeight++;
stringLists.Add(line.Split(' '));
}
arrayArea = lineLength * arrayHeight;
for (int y = 0; y < lineLength; y++)
{
for (int x = 0; x < arrayHeight; x++)
{
try
{
string currentLine = stringLists[x][y].ToString();
List<string[]> currentLineSections = new List<string[]>();
currentLineSections.Add(currentLine.Split(','));
Map[x, y].textureIndex = Convert.ToInt16(currentLineSections[0][0].ToString());
Map[x, y].accessoryIndex = Convert.ToInt16(currentLineSections[0][1].ToString());
if (currentLineSections[0][2].ToString() == "1")
Map[x, y].colliding = true;
else
Map[x, y].colliding = false;
if (currentLineSections[0][3].ToString() == "1")
Map[x, y].startLocation = true;
else
Map[x, y].startLocation = false;
if (currentLineSections[0][4].ToString() == "1")
Map[x, y].portal = true;
else
Map[x, y].portal = false;
if (currentLineSections[0][5].ToString() == "1")
Map[x, y].portalExit = true;
else
Map[x, y].portalExit = false;
Map[x, y].portalNumber = Convert.ToInt16(currentLineSections[0][6].ToString());
Map[x, y].portalDestination = new Vector2(Convert.ToInt16(currentLineSections[0][7].ToString()), Convert.ToInt16(currentLineSections[0][8].ToString()));
}
catch (Exception e)
{
}
}
}
reader.Close();
}
catch (Exception)
{
}
}
public void Save()
{
try
{
TextReader TR = new StreamReader("C:/Users/Cogythea/Documents/Programming TextFiles/TileMap.tilemap");
TR.Close();
}
catch (Exception)
{
FileStream create = File.Create("C:/Users/Cogythea/Documents/Programming TextFiles/TileMap.tilemap");
create.Close();
}
StreamWriter writer = new StreamWriter("C:/Users/Cogythea/Documents/Programming TextFiles/TileMap.tilemap");
for(int x = 0; x < Map.GetLength(0); x++)
{
for (int y = 0; y < Map.GetLength(1); y++)
{
writer.Write(Map[x, y].textureIndex.ToString() + ",");
writer.Write(Map[x, y].accessoryIndex.ToString() + ",");
if(Map[x,y].colliding)
writer.Write("1,");
else
writer.Write("0,");
if (Map[x, y].startLocation)
writer.Write("1,");
else
writer.Write("0,");
if (Map[x, y].portal)
writer.Write("1,");
else
writer.Write("0,");
if (Map[x, y].portalExit)
writer.Write("1,");
else
writer.Write("0,");
writer.Write(Map[x, y].portalNumber.ToString() + ",");
writer.Write(Map[x, y].portalDestination.X.ToString() + ",");
writer.Write(Map[x, y].portalDestination.Y.ToString() + ",");
writer.Write(" ");
}
writer.WriteLine();
}
writer.Close();
}
これに代わる方法をインターネットで探していたところ、情報を格納するための XML ファイルが圧倒的にサポートされていることがわかりました。さて、これについて2つ質問があります。1 つ目は、私がコードに使用しているチュートリアル ( http://msdn.microsoft.com/en-us/library/bb203924.aspx ) では、IAsyncResult に StorageDevice を使用するように指示されていますが、それを宣言すると Visual Studio がもたらします。 2つの問題のうちの1つ:初期化しないと、存在しないと表示されますが(ご想像のとおり)、初期化すると-
StorageDevice device = new StorageDevice();
「型 'Microsoft.Xna.Framework.Storage.StorageDevice' にはコンストラクターが定義されていません」というエラーが表示されますが、括弧内に必要なものがあることはわかりません。これを機能させるにはどうすればよいですか? これについての助けは大歓迎です。私の2番目の質問は、これに代わるものがあるかどうか、または私の元の方法は正しかったが改善が必要であったかどうかです. 空き時間に 2 週間オン/オフでこの問題を解決しようとしてきたので、何か助けていただければ幸いです。ありがとう。