Ułatwienie wdrażania gier XNA dla programistów

12

Obecnie pracuję nad RPG, używając bazy startowej RPG od XNA jako podstawy. (http://xbox.create.msdn.com/en-US/education/catalog/sample/roleplaying_game) Pracuję z małym zespołem (dwóch projektantów i jeden wykonawca muzyki / dźwięku), ale jestem jedynym programista. Obecnie pracujemy z następującym (niezrównoważonym) systemem: zespół tworzy nowe zdjęcia / dźwięki, aby dodać je do gry, lub modyfikuje istniejące dźwięki / zdjęcia, a następnie przekazuje swoją pracę do repozytorium, w którym przechowujemy aktualną wersję wszystkiego. (Kod, obrazy, dźwięk itp.) Każdego dnia tworzę nowy instalator, odzwierciedlający nowe obrazy, zmiany kodu i dźwięk, i wszyscy go instalują.

Mój problem jest następujący: chcę stworzyć system, w którym reszta zespołu może na przykład zastąpić dźwięki walki i natychmiast zobaczyć zmiany, bez konieczności czekania, aż zbuduję. Sposób, w jaki XNA konfiguruje, jeśli opublikuję, koduje wszystkie pliki graficzne i dźwiękowe, więc zespół nie może „wymieniać”. Mogę skonfigurować Microsoft VS na wszystkich komputerach i pokazać im, jak szybko publikować, ale chciałem wiedzieć, czy istnieje prostszy sposób na zrobienie tego.

Czy ktoś wpadł na to podczas pracy z zespołami używającymi XNA?

Sal
źródło
2
Przez kodowanie XNA wszystkich obrazów i plików dźwiękowych masz na myśli, że są one budowane przez potok treści XNA i zamieniane w pliki .xnb?
David Gouveia,
Nie pamiętam dokładnego rozszerzenia, ale oni przechodzą przez standardowy potok, tak.
Sal

Odpowiedzi:

12

Po pierwsze, nie sądzę, że musisz publikować i tworzyć instalator za każdym razem. Po prostu skompiluj projekt i umieść pliki wyjściowe (tj. Plik EXE i folder zawartości oraz wszelkie zależności DLL, których możesz użyć) w repozytorium, i powinien on również działać na ich komputerze, o ile mają one zainstalowany redystrybutor XNA.

Jeśli chodzi o twoje pytanie, mogę wymyślić dwa rozwiązania, z których jedno polega na zainstalowaniu programu Visual Studio na swoich komputerach, a drugie na wprowadzeniu pewnych zmian w grze:

  • Poproś ich o zainstalowanie programu Visual Studio i nauczenie, jak przekazywać zasoby przez potok treści XNA. Muszą tylko utworzyć projekt potoku treści, przeciągnąć tam pliki i skompilować. Następnie mogą zamienić wynikowe pliki XNB z plikami w folderze projektu i uruchomić plik EXE, aby zobaczyć zmiany.

  • Jeśli programujesz dla systemu Windows, możesz zmienić kod, aby ładował zasoby w czasie wykonywania w ich oryginalnych formatach, bez konieczności przechodzenia przez potok treści. Aby załadować obrazy, których możesz użyć Texture2D.FromStream(jak w tym przykładzie ), a dla dźwięku najlepszym rozwiązaniem, jakie znalazłem, było użycie zamiast tego interfejsu API FMOD (jak w tym przykładzie ). Następnie mogą po prostu zamienić zasoby bezpośrednio i uruchomić grę.

Aby pójść jeszcze dalej, możesz również spróbować, aby twoja gra była jak najbardziej oparta na danych. Zasadniczo oznacza to, że wszystko, co powinieneś być w stanie łatwo zmienić, takie jak statystyki klas postaci lub ścieżka obrazów i plików dźwiękowych, których używasz, należy usunąć z kodu i umieścić w zewnętrznych plikach tekstowych (np. XML, JSON, INI). Następnie wystarczy edytować te pliki w edytorze tekstów, aby zobaczyć zmiany w grze, i nie trzeba ich odbudowywać.

David Gouveia
źródło
1
Dziękuję za szybką odpowiedź. Podoba mi się twoje drugie rozwiązanie i mam z tego pytanie: czy istnieje sposób, aby VS stworzył flagę podobną stylem do #IF DEBUG, co pozwoliłoby mi zrobić coś takiego, #IF NON_PRODUCTION_MODE, w ten sposób mogę owinąć wszystkie wywołania FromStream () w tym wywołaniu nieprodukcyjnym. Wreszcie, gdy będę gotowy do wysłania gry do produkcji, z łatwością będę mógł przełączać tryby i ponownie kodować pliki dźwiękowe.
Sal
1
@Sal Tak, możesz to zrobić. Sprawdź dokumentację tutaj .
David Gouveia,
1
@Sal Domyślnie Visual Studio tworzy dwa profile kompilacji: debugowanie i wydanie. Możesz przełączać się między nimi z Build->Configuration Manager. Domyślnie kompilacja debugowania ma DEBUGzdefiniowany symbol kompilacji, co oznacza, że ​​możesz owinąć swój kod nie wydany #if ( DEBUG ) doStuffIWouldntDoInRelease(); #elif theActualReleaseCode(); #endif.
Cypher
1
@Sal Stwierdziłem również, że dużo łatwiej było po prostu włączyć katalog bin / * do repozytorium i poprosić projektantów / wykonawców / qa, aby po prostu sprawdzili folder bin, aby mogli uruchomić najnowszą i najlepszą wersję. W ten sposób łączą wszystkie zależności, tekstury, audio itp. Potem każdego dnia musieli tylko znajdować się svn updatew katalogu roboczym i byli na bieżąco.
Cypher,
4

Trochę późno na imprezę, ale oto mój pomysł.

Wybrałbym trzecią możliwość, która nie wymaga niczego takiego jak modyfikowanie już istniejącej bazy kodu. Będzie to działać, jeśli zatwierdzisz (i skopiujesz) pliki binarne (rzeczywistą .exe gry i powiązane pliki DLL z kompilacji) gdzieś w katalogu wyjściowym - na przykład za pomocą skryptu po kompilacji. Dalej zakładam, że mówimy o Visual Studio 2010 i XNA Game Studio 4.0 (procedura jest bardzo podobna w przypadku innych wersji, wystarczy wymienić niektóre cyfry)

Tak więc pomysł jest taki: utwórz skrypt (.cmd) w katalogu głównym projektu, w którym znajduje się rozwiązanie .sln, wykonując następujące kroki:

  1. Wywołaj „Wiersz polecenia programu Visual Studio 2010”:

    wywołaj „C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ vcvarsall.bat” x86

    Ma to na celu umożliwienie naszemu skryptowi odnalezienia bibliotek XNA oraz wszystkich wymaganych narzędzi i plików binarnych.

  2. Wywołaj zadanie MSBuild w projekcie treści (.contentproj):

    msbuild / property: XNAContentPipelineTargetPlatform = Windows / property: XNAContentPipelineTargetProfile = Zasięg mygame.content / projectfile.contentproj

    Możesz modyfikować właściwości przez określone różne platformy / profile. Możesz nawet posunąć się dalej, aby tworzyć treści dla większej liczby platform jednocześnie (Windows Phone, Xbox 360 lub Windows). Profil może być: Reach lub HiDef (http://msdn.microsoft.com/en-us/library/ff604995.aspx)

  3. Skopiuj rekurencyjnie dane wyjściowe do folderu, w którym pliki binarne + aktualna gra jest przechowywana w repozytorium:

    xcopy / d / y / i / e bin \ x86 \ Debug \ Content * .. \ game_output \ Content

    Szczegółowe informacje na temat flag, można powołać się w wierszu polecenia: xcopy /?. Ważne są:, /daby kopiować tylko zmodyfikowane pliki - w przypadku wielu zasobów przydatne jest, aby nie kopiować w kółko tych już istniejących i niezmodyfikowanych; /ydo automatycznego nadpisywania istniejących plików, aby można je było zaktualizować do nowszej wersji. Użyłem, xcopyponieważ normalnie copynie mogę kopiować folderów rekurencyjnych, o ile mi wiadomo - i prawdopodobnie porządkujesz zawartość folderów i podfolderów. Ponadto jest lepszy niż zwykle copy(wiele różnych flag).

  4. Zadzwoń, pauseaby skrypt czekał na dane wejściowe użytkownika. Jest to przydatne, aby sprawdzić, czy kompilacja była poprawna i nie napotkano błędów.

Teraz artyści (lub ktokolwiek), którzy modyfikują pliki zawartości, muszą tylko dwukrotnie kliknąć skrypt .cmd, a nowa treść zostanie zbudowana i skopiowana do katalogu wyjściowego, w którym znajdują się zatwierdzone artefakty, gotowa do przetestowania.

Istnieje jednak niewielki problem, do którego musisz wrócić do pierwszego punktu postu Davida: jeśli artyści chcą zmodyfikować projekt Treści poprzez dodanie / usunięcie / przeniesienie plików, muszą to zrobić, otwierając projekt w Visual Studio (lub ręcznie edytuj plik projektu, co, jak sądzę, nikt by nie zrobił). Jak powiedziałem, jest to niewielki problem, ponieważ mogą po prostu zatwierdzić nowe pliki w repozytorium, a Ty, koder, umieści je w Projekcie treści, gdy kod zostanie zrobiony, aby je obsłużyć.

Na ten temat Shawn Hargreaveas opublikował coś o msbuild i budowaniu projektów treści z wiersza poleceń: http://blogs.msdn.com/b/shawnhar/archive/2006/11/07/build-it-ahead-of-time .aspx Jego rozwiązaniem było utworzenie nowego pliku, ale myślę, że łatwiej i łatwiej jest go obsługiwać bezpośrednio z już istniejącego pliku projektu.

PS: Przepraszam za długi post xD

Timotei
źródło