XboxLive 使用连接的存储 可以实现游戏数据在不同设备上的加载切换
可以存储一些简单的游戏数据(float) 又或者存储字符串string用于json序列化/反序列化还原自定义游戏数据对象
public static partial class GameParameter
{
const string c_saveContainerDisplayName = "GameSave";
const string c_saveContainerName = "GameSaveContainer";
public const string json = "blob_json_string";
public const string 关卡 = "blob_level";
public const string 宝石数 = "blob_gem";
public const string 移速 = "blob_move_speed";
public const string 跳跃力 = "blob_jump_strength";
public const string 攻速 = "blob_attack_speed";
public const string 攻击力 = "blob_attack_strength";
public const string 生命值 = "blob_max_life";
private const string ServiceConfigurationId = "00000000-0000-0000-0000-0000********";
//public static XboxLiveContext context
//{
// get {
// Debug.WriteLine(XboxLiveHelper.context.AppConfig.ServiceConfigurationId);
// return XboxLiveHelper.context;
// }
//}
public static async void WriteData(string blobName, string data)
{
var users = await Windows.System.User.FindAllAsync();
GameSaveProvider gameSaveProvider;
GameSaveProviderGetResult gameSaveTask = await GameSaveProvider.GetForUserAsync(users[0],
ServiceConfigurationId);
if (gameSaveTask.Status == GameSaveErrorStatus.Ok)
{
gameSaveProvider = gameSaveTask.Value;
}
else
{
return;
//throw new Exception("Game Save Provider Initialization failed");
}
//Now you have a GameSaveProvider (formerly ConnectedStorageSpace)
//Next you need to call CreateContainer to get a GameSaveContainer (formerly ConnectedStorageContainer)
GameSaveContainer gameSaveContainer = gameSaveProvider.CreateContainer(c_saveContainerName);
// this will create a new named game save container with the name = to the input name
//Parameter
//string name
// To store a value in the container, it needs to be written into a buffer, then stored with
// a blob name in a Dictionary.
DataWriter writer = new DataWriter();
writer.WriteString(data); //some number you want to save, in this case 23.
IBuffer dataBuffer = writer.DetachBuffer();
var blobsToWrite = new Dictionary<string, IBuffer>();
blobsToWrite.Add(blobName, dataBuffer);
GameSaveOperationResult gameSaveOperationResult = await gameSaveContainer.SubmitUpdatesAsync(blobsToWrite,
null, c_saveContainerDisplayName);
}
public static async void WriteData(string blobName, float data)
{
var users = await Windows.System.User.FindAllAsync();
GameSaveProvider gameSaveProvider;
GameSaveProviderGetResult gameSaveTask = await GameSaveProvider.GetForUserAsync(users[0],
ServiceConfigurationId);
if (gameSaveTask.Status == GameSaveErrorStatus.Ok)
{
gameSaveProvider = gameSaveTask.Value;
}
else
{
Debug.WriteLine("Game Save Provider Initialization failed");
return;
}
GameSaveContainer gameSaveContainer = gameSaveProvider.CreateContainer(c_saveContainerName);
DataWriter writer = new DataWriter();
writer.WriteSingle(data);
IBuffer dataBuffer = writer.DetachBuffer();
var blobsToWrite = new Dictionary<string, IBuffer>();
blobsToWrite.Add(blobName, dataBuffer);
GameSaveOperationResult gameSaveOperationResult = await gameSaveContainer.SubmitUpdatesAsync(blobsToWrite,
null, c_saveContainerDisplayName);
}
public static async Task<string> ReadData(string blobName)
{
//int intData=0;
var users = await Windows.System.User.FindAllAsync();
GameSaveProvider gameSaveProvider;
GameSaveProviderGetResult gameSaveTask = await GameSaveProvider.GetForUserAsync(users[0],
ServiceConfigurationId);
//Parameters
//Windows.System.User user
//string SCID
if (gameSaveTask.Status == GameSaveErrorStatus.Ok)
{
gameSaveProvider = gameSaveTask.Value;
}
else
{
return "";
//throw new Exception("Game Save Provider Initialization failed");;
}
//Now you have a GameSaveProvider
//Next you need to call CreateContainer to get a GameSaveContainer
GameSaveContainer gameSaveContainer = gameSaveProvider.CreateContainer(c_saveContainerName);
//Parameter
//string name (name of the GameSaveContainer Created)
//form an array of strings containing the blob names you would like to read.
string[] blobsToRead = new string[] { blobName };
// GetAsync allocates a new Dictionary to hold the retrieved data. You can also use ReadAsync
// to provide your own preallocated Dictionary.
GameSaveBlobGetResult result = await gameSaveContainer.GetAsync(blobsToRead);
string loadedData = "";
//Check status to make sure data was read from the container
if (result.Status == GameSaveErrorStatus.Ok)
{
//prepare a buffer to receive blob
IBuffer loadedBuffer;
//retrieve the named blob from the GetAsync result, place it in loaded buffer.
result.Value.TryGetValue(blobName, out loadedBuffer);
if (loadedBuffer == null)
{
Debug.WriteLine(string.Format("Didn't find expected blob \"{0}\" in the loaded data.", blobName));
}
loadedData = Encoding.UTF8.GetString(loadedBuffer.ToArray());
}
return loadedData;
}
public static async Task<float> ReadDataNumber(string blobName)
{
//int intData=0;
var users = await Windows.System.User.FindAllAsync();
GameSaveProvider gameSaveProvider;
GameSaveProviderGetResult gameSaveTask = await GameSaveProvider.GetForUserAsync(users[0],
ServiceConfigurationId);
//Parameters
//Windows.System.User user
//string SCID
if (gameSaveTask.Status == GameSaveErrorStatus.Ok)
{
gameSaveProvider = gameSaveTask.Value;
}
else
{
return -1f;
//throw new Exception("Game Save Provider Initialization failed");;
}
//Now you have a GameSaveProvider
//Next you need to call CreateContainer to get a GameSaveContainer
GameSaveContainer gameSaveContainer = gameSaveProvider.CreateContainer(c_saveContainerName);
//Parameter
//string name (name of the GameSaveContainer Created)
//form an array of strings containing the blob names you would like to read.
string[] blobsToRead = new string[] { blobName };
// GetAsync allocates a new Dictionary to hold the retrieved data. You can also use ReadAsync
// to provide your own preallocated Dictionary.
GameSaveBlobGetResult result = await gameSaveContainer.GetAsync(blobsToRead);
float loadedData = 0;
//Check status to make sure data was read from the container
if (result.Status == GameSaveErrorStatus.Ok)
{
//prepare a buffer to receive blob
IBuffer loadedBuffer;
//retrieve the named blob from the GetAsync result, place it in loaded buffer.
result.Value.TryGetValue(blobName, out loadedBuffer);
if (loadedBuffer == null)
{
Debug.WriteLine(String.Format("Didn't find expected blob \"{0}\" in the loaded data.", blobName));
return -1f;
}
DataReader reader = DataReader.FromBuffer(loadedBuffer);
loadedData = reader.ReadSingle();
}
return loadedData;
}
public static async void DeleteData(string blobName)
{
var users = await Windows.System.User.FindAllAsync();
GameSaveProvider gameSaveProvider;
GameSaveProviderGetResult gameSaveTask = await GameSaveProvider.GetForUserAsync(users[0],
ServiceConfigurationId);
//Parameters
//Windows.System.User user
//string SCID
if (gameSaveTask.Status == GameSaveErrorStatus.Ok)
{
gameSaveProvider = gameSaveTask.Value;
}
else
{
return;
//throw new Exception("Game Save Provider Initialization failed");
}
//Now you have a GameSaveProvider (formerly ConnectedStorageSpace)
//Next you need to call CreateContainer to get a GameSaveContainer (formerly ConnectedStorageContainer)
GameSaveContainer gameSaveContainer = gameSaveProvider.CreateContainer(c_saveContainerName); // this will
string[] blobsToDelete = new string[] { blobName };
//Call SubmitUpdatesAsync with the dictionary of the names of blobs to delete as the second parameter.
GameSaveOperationResult gameSaveOperationResult = await gameSaveContainer.SubmitUpdatesAsync(null,
blobsToDelete, c_saveContainerDisplayName);
//Parameters
//IReadOnlyDictionary<String, IBuffer> blobsToWrite
//IEnumerable<string> blobsToDelete
//string displayName
//Check status of the operation to ensure successful delete.
if (gameSaveOperationResult.Status == GameSaveErrorStatus.Ok)
{
//Successful Deletion Logic
}
else
{
//handle failed deletion logic.
}
//DELETE A SAVE CONTAINER
GameSaveOperationResult deleteContainerResult = await
gameSaveProvider.DeleteContainerAsync(c_saveContainerName);
//Parameter
//string name (name of container to be deleted)
//Check status of the operation to ensure successful delete.
if (deleteContainerResult.Status == GameSaveErrorStatus.Ok)
{
//Successful Deletion Logic
}
else
{
//handle failed deletion logic.
}
}
}
end