Also habe ich es endlich geschafft, mit XNA herumzuspielen und ein 2D-Spiel zu erstellen (ich habe einige Kunstobjekte von einem Freund, der es für iOS entwickelt hat).
Viele Dinge scheinen einfach zu erledigen zu sein und kommen aus dem Kasten, aber ich bin verblüfft, weil die meiste Literatur (zum Beispiel die Bücher, die ich gekauft habe) 2D nicht allzu viel Aufmerksamkeit schenkt.
Ich würde mich über jede Klarstellung oder jeden Hinweis auf weitere Informationen zu den folgenden Fragen sehr freuen:
Was ist der Sinn eines Game Service? Ich verstehe die ganze Redewendung, ein Objekt als Dienst zu registrieren, damit es von jeder anderen GameComponent abgerufen werden kann. Wie schlägt sich das jedoch einfach nieder, wenn es möglicherweise öffentlich oder statisch ist? In meinem Buch wurde beispielsweise empfohlen, das SpriteBatch-Objekt in der Game.cs-Klasse zu registrieren. Ich bin mir nicht sicher, wie das vorzuziehen ist, es einfach öffentlich / statisch zu machen, da es sowieso nur eine Instanz von Game geben sollte (Singleton)?
Ich bin verwirrt, wann ich von GameComponent oder RenderableGameComponent erben soll. Ich versuche, einem Manager- / Controller-Design zu folgen, sodass alle Entitäten von einem einzigen Manager erstellt werden und für andere Dinge die gleichen. Ich habe derzeit jeden Manager / Controller von GameComponent geerbt. Wie schlägt es sich jedoch, wenn das Game-Objekt alle Manager besitzt und die Aktualisierung manuell aufruft und zeichnet?
Mir ist aufgefallen, dass Initialize vor ContentLoad () aufgerufen wird. Ich fand das ärgerlich, da ich in Initialize einige meiner Entitäten (z. B. Sprite, Player usw.) erstellen möchte, aber ich kann sie nicht mit ihren geladenen Entitäten versehen SpriteSheets oder Textures sind seit dem Aufruf zum Laden noch nicht aufgetreten. Initialisiere ich möglicherweise falsch oder weisen die Benutzer die Textur nur weiter unten in ContentLoad zu?
Das scheint mein größter " WTF " zu sein, der nicht wirklich versteht
quelle
SpriteBatch.Draw
wird in Textur-Pixel-Koordinaten relativ zur oberen linken Ecke der Textur (oder des Quellrechtecks, falls Sie eines verwenden) angegeben.public
/static
properties basiert . Warum? Testbarkeit. Es ist nahezu unmöglich, Dinge mit dem Property-Ansatz auszutauschen, während es trivial ist, wenn alles mit einem initialisiert wirdIServiceProvider
, das durch Ihre Testmethode mit allem gefüllt werden kann, was die Klasse benötigt. Es wird auch vermieden, dasGame
Objekt selbst in Ihrem Test zu instanziieren , was sehr schnell chaotisch wird.Game
Objekt. Der Zugriff auf sie erfolgt zufällig über Schnittstellen, inGame.Services
die sie hineingeschoben werden, und die dann an alles weitergegeben werden, um wieder das herauszufinden, was sie brauchen.Bei Ihrer ersten Frage muss ich zugeben, dass ich die eigentliche Antwort nicht wirklich kenne. Ich denke, es wäre aus dem gleichen Grund, warum Singleton im Allgemeinen ein schlechtes Designmuster ist. Ich verweise Sie auf ein Zitat aus diesem Link :
Für Ihre zweite Frage würde ich annehmen, dass die Verwendung von Komponenten wie dieser sinnvoller wäre, wenn Sie stattdessen einen komponentenbasierten Ansatz verfolgen würden, als wenn Sie eine Liste von
Sprite
Komponenten hätten, die wissen, wie sie sich selbst zeichnen und aktualisieren können, anstatt eines Manager, der weiß, wie man jedes Sprite aktualisiert und zeichnet. Ich stimme zu, es klingt genauso, aber ich bevorzuge ein komponentenbasiertes Design, weil mir der objektorientierte Ansatz wirklich gefällt.Ja, für Ihre dritte Frage sollten Sie jede Form von Inhalt (Elemente, Schriftarten usw.) in die LoadContent-Methode laden. Bei der Initialisierung erstellen Sie normalerweise das Player-Objekt in der Initialisierungsfunktion und laden dann dessen Inhalt in LoadContent. Sie können aber auch alles in LoadContent ausführen, wenn Sie dies wünschen.
quelle