gpt4 book ai didi

savestate - 在XNA 4.0中保存游戏数据的一个好例子是什么?

转载 作者:行者123 更新时间:2023-12-04 13:21:18 24 4
gpt4 key购买 nike

我正在尝试通过有关保存和读取游戏数据的XNA MSDN文档进行工作,但我的运气并不好。

本质上,我有一个经理类,它跟踪基类的多个实例。

我希望能够保存经理一直跟踪的对象的整个列表的状态,然后在下次游戏加载时加载它们。基本上可以保存世界状况。

最佳答案

如果您使用XNA 4.0帮助中所示的XmlSerializer,则基类需要为可以序列化到的每种具体类型指定[XmlInclude(Type)]属性。

下面是一个如何在XNA 4.0中保存游戏数据的示例。游戏运行后,按F1保存。数据将保存到类似于C:\Users\{用户名}\Documents\SavedGames\WindowsGame\Game1StorageContainer\Player1的位置。

再次加载数据是非常相似的过程。

要使它在XBox上正常工作,请添加对Microsoft.Xna.Framework.GamerServices和System.Xml.Serialization的引用。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Xml.Serialization;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Storage;
using Microsoft.Xna.Framework.GamerServices;

namespace WindowsGame
{
[XmlInclude(typeof(Soldier)), XmlInclude(typeof(Grenade))]
public class BaseGameObject
{
public Vector3 Position { get; set; }
}

public class Soldier : BaseGameObject
{
public float Health { get; set; }
}

public class Grenade : BaseGameObject
{
public float TimeToDetonate { get; set; }
}

public struct SaveGameData
{
public string PlayerName;
public Vector2 AvatarPosition;
public int Level;
public int Score;
public List<BaseGameObject> GameObjects;
}

public class Game1 : Microsoft.Xna.Framework.Game
{
enum SavingState
{
NotSaving,
ReadyToSelectStorageDevice,
SelectingStorageDevice,

ReadyToOpenStorageContainer, // once we have a storage device start here
OpeningStorageContainer,
ReadyToSave
}

GraphicsDeviceManager graphics;
KeyboardState oldKeyboardState;
KeyboardState currentKeyboardState;
StorageDevice storageDevice;
SavingState savingState = SavingState.NotSaving;
IAsyncResult asyncResult;
PlayerIndex playerIndex = PlayerIndex.One;
StorageContainer storageContainer;
string filename = "savegame.sav";

SaveGameData saveGameData = new SaveGameData()
{
PlayerName = "Grunt",
AvatarPosition = new Vector2(10, 15),
Level = 3,
Score = 99424,
GameObjects = new List<BaseGameObject>()
{
new Soldier { Health = 10.0f, Position = new Vector3(0.0f, 10.0f, 0.0f) },
new Grenade { TimeToDetonate = 3.0f, Position = new Vector3(4.0f, 3.0f, 0.0f) }
}
};

public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";

#if XBOX
Components.Add(new GamerServicesComponent(this));
#endif

currentKeyboardState = Keyboard.GetState();
}

protected override void Update(GameTime gameTime)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();

oldKeyboardState = currentKeyboardState;
currentKeyboardState = Keyboard.GetState();

UpdateSaveKey(Keys.F1);
UpdateSaving();

base.Update(gameTime);
}

private void UpdateSaveKey(Keys saveKey)
{
if (!oldKeyboardState.IsKeyDown(saveKey) && currentKeyboardState.IsKeyDown(saveKey))
{
if (savingState == SavingState.NotSaving)
{
savingState = SavingState.ReadyToOpenStorageContainer;
}
}
}

private void UpdateSaving()
{
switch (savingState)
{
case SavingState.ReadyToSelectStorageDevice:
#if XBOX
if (!Guide.IsVisible)
#endif
{
asyncResult = StorageDevice.BeginShowSelector(playerIndex, null, null);
savingState = SavingState.SelectingStorageDevice;
}
break;

case SavingState.SelectingStorageDevice:
if (asyncResult.IsCompleted)
{
storageDevice = StorageDevice.EndShowSelector(asyncResult);
savingState = SavingState.ReadyToOpenStorageContainer;
}
break;

case SavingState.ReadyToOpenStorageContainer:
if (storageDevice == null || !storageDevice.IsConnected)
{
savingState = SavingState.ReadyToSelectStorageDevice;
}
else
{
asyncResult = storageDevice.BeginOpenContainer("Game1StorageContainer", null, null);
savingState = SavingState.OpeningStorageContainer;
}
break;

case SavingState.OpeningStorageContainer:
if (asyncResult.IsCompleted)
{
storageContainer = storageDevice.EndOpenContainer(asyncResult);
savingState = SavingState.ReadyToSave;
}
break;

case SavingState.ReadyToSave:
if (storageContainer == null)
{
savingState = SavingState.ReadyToOpenStorageContainer;
}
else
{
try
{
DeleteExisting();
Save();
}
catch (IOException e)
{
// Replace with in game dialog notifying user of error
Debug.WriteLine(e.Message);
}
finally
{
storageContainer.Dispose();
storageContainer = null;
savingState = SavingState.NotSaving;
}
}
break;
}
}

private void DeleteExisting()
{
if (storageContainer.FileExists(filename))
{
storageContainer.DeleteFile(filename);
}
}

private void Save()
{
using (Stream stream = storageContainer.CreateFile(filename))
{
XmlSerializer serializer = new XmlSerializer(typeof(SaveGameData));
serializer.Serialize(stream, saveGameData);
}
}

protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);

base.Draw(gameTime);
}
}
}

关于savestate - 在XNA 4.0中保存游戏数据的一个好例子是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3723287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com