Staying true to being a ripoff of Java, C Sharp makes saving files extremely painful just as Java does. I just want to save the player ranks and the highest level completed, which would probably be 5 to 10 lines of code in Ruby. This is more confusing in Java, since two or three different writer classes must be created. In XNA and C Sharp, the method for saving files is poorly documented. There is some documentation from Microsoft on saving files, but the code is really fragmented on the page, it doesn’t explain where some of the core objects (like StorageDevice) are created, and I could never get the XML serialization to work even though I imported the XML/Serialization references multiple times and have all the requried “using” statements in the class headers. They do include a ZIP file of example code, but it doesn’t include the necessary references, and it is really spaghetti code because it tries to perform every single file operation known to mankind in one class file. Therefore, it becomes an Easter Egg hunt to get it working. The NeHe tutorials are a good example of how to properly write code tutorials. This thread gave some additional insight on how to write save game files, but as one poster mentions it is not compatible with XBox360. Found another tutorial, which seems to be simpler to follow since it doesn’t include all of the XML serialization, which is really overkill for what I’m trying to do now (just writing integers to a file). This is also becoming very aggravating because it never explains how to actually get a handle to a StorageDevice instance. These examples just show the StorageDevice object being passed as a parameter.
Now I know how this guy feels.
So after about an hour of debugging the example StorageDemo code, I was able to get it working in a new game project (still can’t get the [Serializable] error to go away, no matter how many includes that I have, so I just commented it out). I’m starting to think that it is not possible to display a device selection screen in an XBLIG (XBox Live Indie Game), because I don’t remember any other XBLIGs having a device selection window. Also, I checked my XBox360 System storage settings, and there didn’t appear to be any data associated to any of the Indie games that I have played. I know at least two of the Indie games I’ve played have had save capabilities, but maybe it was not done through the standard XBox storage device select interface. Maybe the device selection capability is blocked in Indie games, just as the Achievement system is blocked. The Indie games that did have saves either made saving ubiquitous or they have a custom designed save screen. Ubiquity is great, and that is definitely the saving approach I want to take if possible. The only problem is that it prevents the player from wiping their data from the System dashboard menu, if the player desires to start the game fresh.
So after 4 good hours of reading unhelpful message threads, poor examples, and endless debugging, I was able to develop a solid method for saving text data to a file. This works for both XBox360 and Windows. The code is below. This is ALL that is required! I don’t have a CLUE why something this relatively simple was made so complicated in the examples! My code could be improved by adding the ability to read multiple lines (instead of using just one single line). Comments are welcome to improve this code, but this works for me so I’m not changing it unless there is a REALLY good reason.
Update: I’ve learned that using a callback method with BeginShowSelector is the best way to read and write to a file. Also, not specifying the PlayerIndex for BeginShowSelector makes things much simpler, because you don’t have to worry about if the player is signed into a profile.
Important: Also required is a call to add a GamerServicesComponent to the Components collection in the constructor of the main game class. this.Components.Add(new GamerServicesComponent(this));
So it’s hard to capture the saving ability in a screenshot, but I now have the save method just writing the maximum level completed to the file. Below is a fresh instance of the game started, with the max level data loaded from the save file and displayed on the screen. The max level data was written to the file in a previous game instance.