MS VS 2010, XNA 4.0
Итак, у меня есть класс Planet, и у него есть функции сохранения и загрузки.
public void SaveToFile(ContentManager content)
{
string path = content.RootDirectory + @"\Objects\Planets\" + this.name +@".planet";
using (BinaryWriter bw = new BinaryWriter(File.Open(path, FileMode.Create)))
{
bw.Write(name);
//sprite names
bw.Write(planet.Sprite.Name); //"planet" is an animation.
bw.Write(planet.HorFrames); //and thats why it has a sprite
bw.Write(planet.VerFrames); //that has a name
bw.Write((double)planet.FPS);
bw.Write(asteroid1.Name);
bw.Write(asteroid2.Name);
bw.Write(asteroid3.Name);
bw.Write(backgroundA.Name);
//update related
bw.Write((double)RSpeed);
bw.Write((double)ASVariety);
bw.Write((double)A1Chance);
bw.Write((double)A2Chance);
bw.Write((double)A3Chance);
bw.Close();
}
}
public void LoadFromFile(ContentManager content, string name)
{
string path = content.RootDirectory + @"\Objects\Planets\" + name + @".planet";
using (BinaryReader br = new BinaryReader(File.OpenRead(path)))
{
this.name = br.ReadString();
this.planet = new Animation(Cont.Texture2D(br.ReadString()), br.ReadInt32(), br.ReadInt32(), (float)br.ReadDecimal(), true);
this.asteroid1 = Cont.Texture2D(br.ReadString());
this.asteroid2 = Cont.Texture2D(br.ReadString());
this.asteroid3 = Cont.Texture2D(br.ReadString());
this.backgroundA = Cont.Texture2D(br.ReadString());
this.RSpeed = (float)br.ReadDouble();
this.ASVariety = (float)br.ReadDouble();
this.A1Chance = (float)br.ReadDouble();
this.A2Chance = (float)br.ReadDouble();
this.A3Chance = (float)br.ReadDouble();
bposB = new Vector2(backgroundA.Width - 1, 0);
bspd = new Vector2(-RSpeed / 8f, 0);
pEngine1 = new ParticleEngine(MSTime, 40, new Vector2(20, -30), new Vector2(2, 1), asteroid1, new Color(100, 100, 100));
pEngine1.Follow(new Vector2(-200, Game1.window_height / 2));
pEngine2 = new ParticleEngine(MSTime * 3, 40, new Vector2(20, -30), new Vector2(2, 1), asteroid2, new Color(100, 100, 100));
pEngine2.Follow(new Vector2(-200, Game1.window_height / 2));
br.Close();
}
Это просто понять, не так ли?
Теперь, когда я пытаюсь загрузить спрайт для анимации планеты, я получаю сообщение об ошибке:
"Значение не может быть нулевым.
Параметр name: assetsName"
и это происходит в строке
this.planet = new Animation(Cont.Texture2D(br.ReadString()), br.ReadInt32(), br.ReadInt32(), ( float)br.ReadDecimal(), true);
Cont.Texture2D — это статическая функция, которая возвращает имя Texture2D, совпадающее с путем, из которого он был загружен, и выглядит следующим образом:
public static Texture2D Texture2D(string path)
{
Texture2D sprite = content.Load<Texture2D>(path);
sprite.Name = path;
return sprite;
}
Итак, когда я сохраняю его, он сохраняет правильный путь. Тестовая функция выглядит следующим образом:
private void testFunction()
{
/*
p = new Planet("Mars",
new Animation(Cont.Texture2D("Sprites\\Planets\\mars"), 8, 2, 0.9f, true),
Cont.Texture2D("Sprites\\Backgrounds\\space"),
Cont.Texture2D("Sprites\\Asteroids\\small\\small 1"),
Cont.Texture2D("Sprites\\Asteroids\\medium\\medium 1"),
Cont.Texture2D("Sprites\\Asteroids\\big\\big 1"),
100, 50, 40, 20, 40, 40);
p.SaveToFile(Content);
*/
p = new Planet(Content, "Mars");
tests = p.ToString();
}
"тесты" - это просто тестовая строка. Теперь я сначала выполняю закомментированный код, чтобы он мог сохранить файл, а затем запускаю некомментированный код. Этот конструктор планеты просто вызывает функцию LoadFromFile и ничего больше. Кроме того, у меня есть сохраненный файл в моем контенте в моем проекте. Я сказал, чтобы этот файл рассматривался как контент (не компилировал его). Итак, код "видит" файл, это точно, но не может найти .png по пути, который был прочитан с mars.planet. Может быть, ошибка, если я сохраняю 2 строки одну за другой, а затем читатель не видит, где конец первой? Может быть, я сохраняю это неправильно?
Моя цель состоит в том, чтобы иметь двоичные файлы, которые будут загружаться и сохраняться, и в них будут планеты, ракеты, карты и т. д., которые представляют собой наборы имен и значений, которые необходимы для конструкторов этих классов.
planet.FPS
какdouble
, но пытаетесь прочитать какdecimal
? - person cbr   schedule 21.06.2015assetName
, значение которого равноnull
, когда требуется ненулевое значение. Наверняка это не имеет прямого отношения кBinaryReader
. Что касается того, что это может быть, это невозможно сказать, если вы не предоставите хороший, минимальный, полный i> пример кода, достоверно воспроизводящий проблему. - person Peter Duniho   schedule 21.06.2015