2

ゲームの保存に問題があり、解決策を探すのに何時間も費やしましたが、うまくいきませんでした。誰かのブログに書かれたこのコードを使用しました:

public class SaveandLoad
{
    StorageDevice device;
    string containerName = "ChainedWingsContainer";
    string filename = "mysave.sav";
    public struct SaveGame
    {
        public int s_mission;
    }

    public void InitiateSave()
    {
        if (!Guide.IsVisible)
        {
            device = null;
            StorageDevice.BeginShowSelector(PlayerIndex.One, this.SaveToDevice, null);
        }
    }

    void SaveToDevice(IAsyncResult result)
    {
        device = StorageDevice.EndShowSelector(result);
        if (device != null && device.IsConnected)
        {
            SaveGame SaveData = new SaveGame()
            {
                s_mission = Game1.mission,
            };
            IAsyncResult r = device.BeginOpenContainer(containerName, null, null);
            result.AsyncWaitHandle.WaitOne();
            StorageContainer container = device.EndOpenContainer(r);
            if (container.FileExists(filename))
                 container.DeleteFile(filename);
            Stream stream = container.CreateFile(filename);
            XmlSerializer serializer = new XmlSerializer(typeof(SaveGame));
            serializer.Serialize(stream, SaveData);
            stream.Close();
            container.Dispose();
            result.AsyncWaitHandle.Close();
        }
    }

    public void InitiateLoad()
    {
        if (!Guide.IsVisible)
        {
            device = null;
            StorageDevice.BeginShowSelector(PlayerIndex.One, this.LoadFromDevice, null);
        }
    }

    void LoadFromDevice(IAsyncResult result)
    {
        device = StorageDevice.EndShowSelector(result);
        IAsyncResult r = device.BeginOpenContainer(containerName, null, null);
        result.AsyncWaitHandle.WaitOne();
        StorageContainer container = device.EndOpenContainer(r);
        result.AsyncWaitHandle.Close();
        if (container.FileExists(filename))
        {
            Stream stream = container.OpenFile(filename, FileMode.Open);
            XmlSerializer serializer = new XmlSerializer(typeof(SaveGame));
            SaveGame SaveData = (SaveGame)serializer.Deserialize(stream);
            stream.Close();
            container.Dispose();
            //Update the game based on the save game file
            Game1.mission = SaveData.s_mission;
        }
    }
}

しかし、実行するたびに、次のメッセージが表示されます。

Microsoft.Xna.Framework.Storage.dll で 'System.InvalidOperationException' 型の未処理の例外が発生しました

追加情報: この PlayerIndex によって使用されたすべての以前のコンテナーが破棄されるまで、新しいコンテナーを開くことはできません。

私は答えを探しましたが、提案のほとんどは Using ステートメントを使用することを提案しています。だから私は次のように使用しました:

    void SaveToDevice(IAsyncResult result)
    {
        device = StorageDevice.EndShowSelector(result);
        if (device != null && device.IsConnected)
        {
            SaveGame SaveData = new SaveGame()
            {
                s_mission = Game1.mission,
            };
            IAsyncResult r = device.BeginOpenContainer(containerName, null, null);
            result.AsyncWaitHandle.WaitOne();
            using (StorageContainer container = device.EndOpenContainer(r))
            {
                if (container.FileExists(filename))
                    container.DeleteFile(filename);
                Stream stream = container.CreateFile(filename);
                XmlSerializer serializer = new XmlSerializer(typeof(SaveGame));
                serializer.Serialize(stream, SaveData);
                stream.Close();
                container.Dispose();
            }
            result.AsyncWaitHandle.Close();
        }
    }

しかし、それでも同じ結果が得られます。私は何を間違っていますか?

4

1 に答える 1

1

この投稿の人は、dispose が正しく呼び出されない原因となっている using ステートメントの範囲外の何らかの例外処理が原因で、同じ問題を抱えていました。代わりに、using ステートメントを try catch でラップしてみてください。

また、解決策を探す際にこの投稿が役立つことがわかりました。

幸運を。

于 2013-01-01T01:55:26.493 に答える