XNA游戏开发之(六)——保存游戏数据

[原创]Alex

  游戏过程中,通常需要存储游戏状态。在下次启动游戏时,重新载入游戏,继续游戏。

  实现过程非常简单,首先建立一个结构体定义需要保存的游戏参数,然后通过XmlSerializer类将其保存为一个XML文档。

    

 

1  interface  GameData
2  {
3      int  GameID;
4      string  PlayName;
5     DateTime Time;
6  }

 

  XNA游戏可运行在XBOX和PC,做到两者的兼容,需要使用StorageDevice将数据保存到磁盘。

首先 一步创建一个StorageDevice,这个过程需要打开Guide并终止程序,直到用户关闭Guide。使用Guide必须在Game类的构造函数中进行注册。

 

1  public  AlexGame()
2  {
3      graphics  =   new  GraphicsDeviceManager( this ); 
4      Content.RootDirectory  =   " Content "
5      Components.Add( new  GamerServicesComponent( this )); 
6 

 

 

第二步 在Update方法中捕获事件。

 

代码
 1  // 获取键盘状态
 2  KeyboardState keyState  =  Keyboard.GetState(); 
 3  // Guide不显示
 4  if  ( ! Guide.IsVisible)
 5  {
 6       // 键盘按下S
 7       if  (keyState.IsKeyDown(Keys.S)) 
 8          Guide.BeginShowStorageDeviceSelector(FindStorageDevice,  " saveRequest " ); 
 9      // 键盘按下L
10       if  (keyState.IsKeyDown(Keys.L)) 
11          Guide.BeginShowStorageDeviceSelector(FindStorageDevice,  " loadRequest " ); 
12 
 
 

 

第三步,定义FindStorageDevice方法

 

代码
 1  private   void  FindStorageDevice(IAsyncResult result)
 2  {
 3      StorageDevice storageDevice  =  Guide.EndShowStorageDeviceSelector(result); 
 4       if  (storageDevice  !=   null )
 5      {
 6           if  (result.AsyncState.ToString()  ==   " saveRequest " )
 7          {
 8               // 保存游戏 
 9              SaveGame(storageDevice);
10          } 
11           else   if  (result.AsyncState.ToString()  ==   " loadRequest " )
12          {
13              // 加载游戏
14              LoadGame(storageDevice); 
15          }    
16      }
17 

 

第四步,定义SaveGame,LoadGame方法:

 

代码
1  private   void  SaveGame(StorageDevice storageDevice) 
2  {
3      StorageContainer container  =  storageDevice.OpenContainer( "AlexGame " ); 
4       string  fileName  =  Path.Combine(container.Path,  " save0001.sav " ); 
5      FileStream saveFile  =  File.Open(fileName, FileMode.Create); 
6      XmlSerializer xmlSerializer  =   new  XmlSerializer( typeof (GameData)); 
7      XmlSerializer.Serialize(saveFile, gameData); 
8      saveFile.Close(); 
9 

 

 

代码
private   void  LoadGame(StorageDevice storageDevice) 
{
    StorageContainer container 
=  storageDevice.OpenContainer( " AlexGame " ); 
    
string  fileName  =  Path.Combine(container.Path,  " save0001.sav " ); 
    
if  (File.Exists(fileName)) 
    {
        FileStream saveFile 
=  File.Open(fileName, FileMode.Open); 
        XmlSerializer xmlSerializer 
=   new  XmlSerializer( typeof (GameData)); 
        gameData 
=  (GameData)xmlSerializer.Deserialize(saveFile); 
        saveFile.Close(); 
    }

 运行游戏后按下键盘S键会在“文档”建立相应的游戏保存文件夹 如AlexGame

你可能感兴趣的:(游戏开发)