Więc w końcu zacząłem bawić się XNA i bawiłem się tworzeniem gry 2D (mam mnóstwo zasobów graficznych od znajomego, który opracował ją na iOS)
Wydaje się, że wiele rzeczy jest łatwych do zrobienia i wychodzi z pudełka, ale jestem zaskoczony wieloma rzeczami, ponieważ większość literatury (na przykład książki, które kupiłam) nie zwraca zbytniej uwagi na 2D.
Byłbym wdzięczny za wszelkie wyjaśnienia lub wskazanie na więcej informacji na temat następujących zadań:
Jaki jest sens usługi gier? Rozumiem cały idiom rejestrowania obiektu jako usługi, aby każdy inny GameComponent mógł go chwycić, ale jak to się bije po prostu czyniąc go publicznym lub statycznym? Na przykład moja książka zaleciła zarejestrowanie obiektu SpriteBatch w klasie Game.cs. Nie jestem pewien, jak to jest lepsze, niż upublicznienie / statyczne, ponieważ i tak powinna istnieć tylko jedna instancja gry (singleton)?
Nie jestem pewien, kiedy powinienem dziedziczyć po GameComponent lub RenderableGameComponent. Staram się postępować zgodnie z projektem menedżera / kontrolera, tak aby wszystkie podmioty były tworzone / posiadane przez jednego menedżera i tak samo w przypadku innych rzeczy. Obecnie każdy menedżer / kontroler dziedziczy po GameComponent, ale jak to się dzieje, że obiekt Game jest właścicielem wszystkich menedżerów i ręcznie wywołuje aktualizację na nich i rysuje?
Zauważyłem, że Initialize jest wywoływane przed ContentLoad (), uważałem to za irytujące, ponieważ w mojej Inicjalizacji jest miejsce, w którym chciałbym utworzyć niektóre z moich bytów (np. Sprite, Player itp.), Jednak nie mogę dać im ich załadowania Arkusze lub tekstury Sprite, ponieważ wywołanie ich załadowania jeszcze nie nastąpiło. Czy być może inicjuję niepoprawnie, czy może ludzie przypisują teksturę dalej w ContentLoad?
To wydaje się być moim największym „ WTF ” niezrozumienia
źródło
SpriteBatch.Draw
jest określony za pomocą współrzędnych tekstur-piksel względem lewego górnego rogu tekstury (lub prostokąta źródłowego, jeśli go używasz).public
/static
właściwości. Dlaczego? Testowalność Jest prawie niemożliwe, aby zmienić rzeczy za pomocą podejścia opartego na właściwościach, podczas gdy jest to trywialne, jeśli wszystko jest inicjowane za pomocą metody,IServiceProvider
która może być wypełniona wszystkim, czego klasa potrzebuje za pomocą metody testowania. Pozwala to również uniknąć konieczności tworzenia instancji samegoGame
obiektu w teście, co bardzo szybko się psuje.Game
obiektu. Zdarza się, że są dostępne za pośrednictwem interfejsów, które są wpychane,Game.Services
a następnie przekazywane do wszystkiego, aby ponownie uzyskać to, czego potrzebują.W przypadku pierwszego pytania muszę przyznać, że tak naprawdę nie znam rzeczywistej odpowiedzi. Myślę, że byłoby to z tego samego powodu, dla którego singleton jest ogólnie złym wzorcem projektowym. Odsyłam cię do cytatu z tego linku :
W przypadku drugiego pytania zakładam, że użycie Komponentów w ten sposób byłoby bardziej przydatne, gdybyś podążał za komponentami podejście , tak jakbyś miał listę
Sprite
komponentów, które potrafiłyby rysować i aktualizować się zamiast menedżer, który wie, jak zaktualizować i narysować każdą duszkę. Zgadzam się, to brzmi tak samo, ale wolę projektowanie oparte na komponentach, ponieważ bardzo podoba mi się podejście obiektowe.W przypadku trzeciego pytania tak należy załadować dowolną formę treści (zasoby, czcionki itp.) W metodzie LoadContent. Jeśli chodzi o inicjalizację, zwykle tworzysz obiekt Player w funkcji Initialize, a następnie ładujesz jego zawartość w LoadContent. Możesz też zrobić to wszystko w LoadContent, jeśli chcesz.
źródło