Serializacja i Deserializacja w XNA

0

Witam. Mam pewien problem. Chciałem napisać dwie gry w XNA. Jednak nie mogą one być zaimplementowane na stałe. Chodzi o to żeby zapisać każdą grę do pliku ze swoim rozszerzeniem. Potem podczas uruchomienia programu xna wczytywałby wszystkie pliki z moim rozszerzeniem i je uruchamiał. Na początku myślałem o tym żeby serializować całe okna gier do jednego pliku i później je deserializować. Jednak to nie działa. Ma ktoś może jakiś sprytny pomysł jakby to zorganizować?

0

Co dokładnie chcesz zrobić? Zapisywać/wczytywać stany gier? Czy może chcesz jakiś system skryptów, tak jak w grach, implementujesz zewnętrzny skrypt a twoja gra go wczytuje i interpretuje go po swojemu?

0

W przypadku XNA sugerowałbym napisanie customowego ContentTypeReadera oraz ContentTypeProcesora. Twoje "gry" byłyby przechowywane w postaci assetów które uruchamiałbyś w XNA. Tutaj możesz poczytać na ten temat http://msdn.microsoft.com/en-us/library/bb447754.aspx

0

Chciałbym uzyskać coś takiego że stworzę teraz nowy projekt w XNA. Stworzę metodę np Wczytaj która będzie miała jako argument lokalizacje do pliku. Chciałbym wczytać ten plik i go uruchomić. Coś a'la serializacja. Jak zserializuje powiedzmy List<String> (zawierający 10 elementów) binarnie do jakiegoś pliku z moim rozszerzeniem to potem wystarczy że w całkowicie innym programie zrobię List<String> lista = (List<String>) zdeserializowany_obiekt; i już mam wszystkie dane jakie ktoś dodał do tej listy. Chciałbym to samo zrobić z grami w XNA. Chciałbym zserializować np całą klasę:
class Game1 : Microsoft.XNA.Framework.Game do mojego pliku a potem napisać program który będzie pobierał wszystkie pliki z konkretnym rozszerzeniem do programu (a w kazdym pliku jest jedna gra) i potrafił je uruchomić. Może troszkę zamieszałem, ale już nie wiem jak prościej to opisać.

0

Czyli chcesz po prostu zrobić coś takiego jak mają emulatory i wczytuje się do nich ROMy. Serializacja o jakiej mówisz tak nie działa. Ona zapisuje tylko dane. Np. musisz znać klasę jaką deserializujesz. Na twoim miejscu po prostu bym dllki zrobił w nich w głównej klasie zaimplementował interfejs z metodą run i wszystkie dllki takie mógłbyś wczytywać i odpalać metodą run. Oczywiście .dll możesz sobie zmienić na coś innego jak tak bardzo chcesz, to tylko nazwa rozszerzenia. Zastanawiam się co ty kombinujesz, bo opisujesz na około wszystko zamiast prosto z mostu powiedzieć co robisz.

0

Chodzi o to że tworze gry interaktywne. Mam napisany silnik do gier w XNA. Mam stworzone z 10 gier. Jednak klienci, którzy ode mnie kupują gry nie zawsze chcą wszystkie. Czasami chcą tylko dwie lub 3. Jeżeli np mam w jednym projekcie mam wszystkie gry to powiedzmy waży to 500 Mb. Jeżeli klient zechce kupić tylko dwie gry to ja muszę zmienić kod (usunąć gry których nie chce itp itd) i mu go wysłać. A chciałbym zrobić to tak, że gry będą np właśnie w takich plikach z własnym rozszerzeniem. Klient dostałby główny silnik. i np kupi 2 gry to wysyłam mu dwa pliki:
gra1.game
gra2.game

Po tygodniu chce dokupić kolejne dwie to wysyłam meilem tylko pliki:
gra3.game
gra4.game

On wrzucając te pliki do odpowiedniego katalogu i uruchamiając główny program będzie miał możliwość wybrania w którą gre chce zagrać. (menu jest generowane dynamicznie). Po to własnie mi była serializacja. Wiem, że muszę znać typ obiektu. Ale programując wszystko od podstaw i wykorzystując polimorfizm będę wiedział co to za klasa.

Chciałbym żeby w plikach z grami (np gra1.game) była zawarta cała gra (obrazki, teksty itp itd). Czy teraz jest już to bardziej jasne? :) Troszkę już z tym walczę i dalej mi nie wychodzi :(

0

Oczywiście myślałem o stworzeniu własnych dll, ale jak je dynamicznie wczytywać? Tzn bez dodawania referencji?

0
Catosik napisał(a):

Oczywiście myślałem o stworzeniu własnych dll, ale jak je dynamicznie wczytywać? Tzn bez dodawania referencji?

Poczytaj o refleksji.

0

Ogólnie kojarzę refleksję w c#, wiem jak wczytać plik dll. Ale nie wiem jak wywołać jakąś metodę. Chociażby konstruktor.

edit:
Już sobie poradziłem :)
o to kod (może komuś się przyda) do uruchomienia metody z konkretnej dll-ki:

[code]
Assembly assembly = Assembly.LoadFile(nazwa_pliku_dll);
Type type = assembly.GetType(nazwa_klasy); //nazwa klasy musi być w postaci: Namespace.Klasa
var obj = Activator.CreateInstance(type);

        type.InvokeMember(nazwa_metody, BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, null);

[/code]

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