High Score z wykorzystaniem xml na Windows Phone XNA

0

Witam, chciałem moją grę uzupełnić o listę wyników graczy. Znalazłem bardzo ciekawy pomysł na rozwiązanie mojego problemu na tej stronie http://xnaessentials.com/tutorials/highscores.aspx. Mam jednak problem z tą linią:

// Convert the object to XML data and put it in the stream
        XmlSerializer serializer = new XmlSerializer(typeof(HighScoreData));
        serializer.Serialize(stream, data);

Otrzymuje taki błąd:
The type or namespace name 'XmlSerializer' could not be found (are you missing a using directive or an assembly reference?)
To przestrzenie nazw które wykorzystuje:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

Rozumiem że przykład który jest pod linkiem był pisany chyba na xboxa ale nie wierzę że nie można zrobić podobnego rozwiązania na WP7. Orientuje się ktoś jak rozwiązać ten problem? A może ma ktoś inny ciekawy pomysł na High Score?

0

Posunąłem się z tematem trochę dalej, tak wygląda mój kod w chwili obecnej:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;

namespace Snake
{
    public struct HighScoreData
    {
        public string[] PlayerName;
        public int[] Score;
        public int[] Level;

        public int Count;

        public HighScoreData(int count)
        {
            PlayerName = new string[count];
            Score = new int[count];
            Level = new int[count];

            Count = count;
        }
    }
    class HighScore
    {
        //private Stream file;
        private HighScoreData data = new HighScoreData(1);
        private string relativeFileName = "/XMLfiles/highscore.xml";
        public void CreateFile()
        {
            data.PlayerName[0] = "Krzys";
            data.Level[0] = 1;
            data.Score[0] = 3;
            XmlWriterSettings xmlSettings = new XmlWriterSettings();
            xmlSettings.Indent = true;
            xmlSettings.NewLineChars = "\n";

            using (Stream strm = TitleContainer.OpenStream(relativeFileName))
            {
                using (XmlWriter outXml = XmlWriter.Create(strm, xmlSettings))
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(HighScoreData));
                    serializer.Serialize(outXml, data);
                }
            } 
        }
    }
}

Mam jednak problem z tą linią:

using (Stream strm = TitleContainer.OpenStream(relativeFileName))

Kompilator wyrzuca wyjątek:
Invalid filename. TitleContainer.OpenStream requires a relative URI.
Próbowałem ten adres wpisywać na 10 różnych sposobów, więc albo nie trafiłem na odpowiedni albo to tak naprawdę nie o to chodzi.

0

http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.titlecontainer.openstream.aspx

Z tego co tutaj widzę, to ta klasa służy raczej do otwierania strumienia tylko do odczytu na istniejącym pliku, a ty chyba chcesz go utworzyć?

0

Konstrukcja nie jest moja więc za dużo nie mogę powiedzieć. W dodatku angielski znam słabo. Samo tworzenie jest chyba w linii poniżej:

using (XmlWriter outXml = XmlWriter.Create(strm, xmlSettings))

W tej linii, która sprawia kłopot jest tylko uzyskiwany parametr do linii poniżej. Metoda Create ma 10 wersji, więc może użyć po prostu jakiejś innej, tylko jakiej.

0

Poczytaj o IsolatedStorage, na wp7 inaczej sie zarzadza plikami.

0

Dzięki za podpowiedź, pchnąłem dzisiaj temat sporo do przodu, ale wygląda na to że wyłożyłem się na elementarnych sprawach. Chodzi mianowicie o tą strukturę:

public struct HighScoreData
    {
        public string[] PlayerName;
        public int[] Score;
        public string[] Level;

        public int Count;

        public HighScoreData(int count)
        {
            PlayerName = new string[count];
            Score = new int[count];
            Level = new string[count];

            Count = count;
        }
    }

Tak jak pisałem wcześniej nie jest moja, ale byłem przekonany że po wywołaniu jej w ten sposób:

private HighScoreData highscoredata = new HighScoreData(5);

Będzie miała po 5 pól z player name, score i level. Tymczasem jest tak że ile bym nie wpisał pole jest jedno. Rozumiem że problem jest banalny;), dlatego proszę o chociaż drobną wskazówkę, na temat tego jak to rozwiązać;).

0

Ech... Tak, problem jest banalny - chcesz zrobić tablicę, a robisz jeden obiekt wywołując jego konstruktor.

0

Dzięki, za odpowiedź. Nie zdążyłem odpisać ale poradziłem sobie z tym;). Problem był troszkę inny, nie wynikający z tego co napisałem. Ta struktura była uzupełniana przez odczyt z pliku xml. W pliku był tylko po jednym elemencie dlatego count co chwila mi się przestawiał na jeden chociaż wyraźnie podawałem 5. Jak wypełniłem sztucznie plik polami do 5 wszystko zaczęło chodzić. Nie wiem czy dobrze to wyjaśniłem ale teraz działa;).

1 użytkowników online, w tym zalogowanych: 0, gości: 1