Nachdem am 16. September ja nun endlich XNA 4.0 erschienen ist, habe ich natürlich auch meine Projekt auf die neue Version aktualisiert. Das ganze hat erstaunlich wenig Probleme gemacht, und nur eine Sachen bereit mir ernsthafte Probleme.
Alte XACT Dateien können nicht gelesen werden. Das Problem lässt sich sehr einfach beheben: Mit dem neuen Game Studio kommt auch ein neues XACT (auch Version 3.0, aber vom Februar 2010). Die alte Datei damit öffnen, Hinweis abnicken und wieder speichern, Problem behoben.
DisplayMode.RefreshRate fehlt. Eines der Probleme, die ich nicht wirklich beheben konnte. Um das Ruckeln von Animationen zu beheben hatte ich die FPS Rate an die Wiederhohlrate des Monitors angepasst. Da die entsprechende Eigenschaft jetzt einfach fehlt, kann ich das so einfach nicht mehr machen.
DLLs, die mit XNA 3.1 kompiliert werde produzieren Probleme. In The Kingdom od Darkness hatte ich eine Libary eingebunden, die die Konsole beinhaltet. Die ist natürlich noch für XNA 3.1 kompiliert, deswegen schlugen alle Zugriffe darauf mit dem Hinweis GameTime kann nicht in GameTime konvertiert werden fehl. Das ist natürlich Blödsinn. Ich habe die Konsole erst mal entfernt, werde sie aber wohl durch etwas anderes ersetzen. (Dazu später mehr)
Aus Effect.Begin/End wird Apply. Eine relativ einfache Änderung: statt für jeden Effect und Pass Begin und End aufzurufen wird nur ein mal für jeden Pass Apply aufgerufen. Technische Details bei Shawn.
Kein Rendertarget.GetTexture mehr. Das war wohl die einfachste Sachen: Ein RenderTarget ist eine Texture2D. Es kann also direkt in Draw verwendet werden.
Kein CompileEffectFromSource mehr. Das ist mein Hauptproblem. Weil es auf der XBox nicht möglich war Shader zu Laufzeit zu kompilieren wurde dieses Feature auch in der Windows Version gestrichen. Es ist zwar generell möglich, aber nur sehr umständlich und nicht auf Clients (Rechnern, die nur das Redistributable installiert haben). Details auch wieder bei Shawn. Damit muss ich mein tolles System, das Post-Processing Shader je nach Bedarf generiert wieder über Bord werfen 🙁
Es gibt keine Color Konstruktor mehr, der die Transparenz ändert. Es wird also aus jedem new Color(Color, byte) eine Color * byte. Das ganze dem Fakt geschuldet, das XNA jetzt vormultipliziertes Alpha benutzt. Ich musste zum Glück nicht viel ändern, sonst wäre ich zu Suchen&Ersetzen übergegangen.
Serialisierte Daten können nicht mehr gelesen werden. Etwas ärgerlich: Alle Klassen, die mit 3.1 serialisiert wurden, können mit 4.0 nicht mehr gelesen werden. Vermutlich gibt es da eine Möglichkeit das Laden zu erzwingen, ich habe einfach eine neue Klasse serialisiert. Wer seine Spielstände so speichert sollte aber aufpassen, das die nach dem Upgrade noch gelesen werden können!
Die Standardauflösung wurde geändert. Wenn man keine Auflösung angibt wird jetzt 800×480 statt 800×600 verwendet. Das entspricht einem Windows Phone im Querformat. Mit zwei Zeilen im Konstruktor war auch dieses Problem gelöst.
Die Assembly im gemischten Modus wurde während Version v2.0.50727 der Laufzeit erstellt und kann nicht während der 4.0-Laufzeit ohne zusätzliche Konfigurationsinformationen geladen werden. Da musste ich dann doch zu Google greifen 😉 Dieser Fehler besagt aber einfach nur, das .NET 4.0 (das jetzt automatisch verwendet wird) keine Assemblies mehr lesen kann, die für .NET 2.0 kompiliert wurden. In meinem Fall betraf das den LUA Wrapper LUA.NET. Wenn man folgenden Zeilen zu seiner app.config hinzufügt wird dieser Schutz aber umgangen:
<configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/> </startup> </configuration>
So, das waren alle Probleme, die ich im Bezug auf XNA 4.0 hatte. Relativ wenig, wenn man bedenkt, dass sie doch viel geändert haben.
Wenn meine Tilemap nicht so groß wäre (was noch geändert wird) könnte ich The Kingdom of Darkness sogar auf dem Reach Profil laufen lassen, das dann ohne Probleme auch auf dem Windows Phone laufen sollte. Wenn ich die Textur verkleinert habe, werde ich das bestimmt mal probieren 😉
Und wenn du einen DreamSpark Account hast kannst du diese Version dann auch kostenlos im Windows Phone Marketplace anbieten 😉
Wäre eine Überlegung wert… Aber dann müsste ich wohl noch etwas mehr Story schreiben 😉