Przenieś silnik na każdą platformę. Nie ma w tym nic specjalnego. Jeśli masz kod tylko dla systemu Windows, dodaj albo logikę #ifdef w pliku, albo dodaj drugi plik (abyś miał FooWindows.cpp
i tak dalej FooLinux.cpp
), który implementuje tę funkcję w innych systemach operacyjnych, na których Ci zależy .
Publikowanie za pomocą jednego kliknięcia, które ma silnik taki jak Unity, jest dozwolone, ponieważ sam Unity nigdy nie jest modyfikowany przez użytkownika końcowego. Po prostu piszesz skrypty i dane, więc silnik ma wbudowane pliki binarne dla wszystkich platform, a przycisk publikowania łączy te pliki binarne razem z danymi.
Inne silniki polegają na systemach kompilacji i kompilatorach krzyżowych, aby w razie potrzeby tworzyć skompilowaną grę, podobnie jak w przypadku aplikacji wieloplatformowych innych niż gry.
W przypadku HTML5 istnieją narzędzia takie jak emscripten, które mogą skompilować aplikację C ++ do działania w JavaScript. Musisz po prostu zrobić inny port silnika dla emscripten (ponieważ nie może on używać dowolnej biblioteki / funkcji C ++).
Nie musisz przepisywać całej gry, ale na pewno będziesz musiał wiele pracy w zakresie programowania, kodowania i przenoszenia dla każdej nowej platformy, którą chcesz obsługiwać.
share/os/<linux>
(lubshare/cpu/x86
) i umieścić tam cały kod specyficzny dla platformy, a następnie zastosować warunkowe dołączenia. Tak przynajmniej robią gcc, HotSpot i jądro Linuksa (z pewnością nie jest to trudna zasada). Tak, możesz zacząć od jednej funkcji, która zależy od platformy i myślisz, że to przesada, ale nigdy tak nie jest i szybko stanie się bałaganem.Tu nie ma magicznej kuli. Jeśli chcesz, aby Twoja gra działała na wielu platformach, musisz napisać kod dla wielu platform (lub wykorzystać biblioteki innych firm, które już to robią).
Rzeczy, o które prosisz, nie pasują do siebie: mówisz (podkreśl moje)
ale także to (ponownie podkreśl moje)
Będziesz musiał zrobić jedno lub drugie: wybierz bibliotekę, silnik i / lub zestaw narzędzi innej firmy, który zapewnia wsparcie dla wielu platform, lub zbuduj własny, pisząc kod dla wielu platform (projektując własna abstrakcja na platformach, które masz do dyspozycji, i implementacja tej abstrakcji dla każdej platformy).
Silniki gier jak Unreal czy Jedności, które obsługują ten albo rekompilacji kodu na odpowiednią platformę abstrakcji, lub wymagać, aby zbudować bibliotekę lub DLL przed ich wewnętrznych interfejsów API, które ładują z platformy konkretnego pliku wykonywalnego kierowcę, który je sporządził dla odpowiedniego Platforma.
źródło
W przeciwieństwie do pozostałych dwóch odpowiedzi (które są słusznie specyficzne dla C ++), istnieje inny sposób. Niektóre architektury, które przychodzą na myśl:
Osobiście uważam, że podejście libGDX jest najprostsze: znajdź język lub platformę, która spełnia twoje potrzeby, i pisz na wierzchu. Generowanie kodu i przenośne silniki są złożone i trudno je dobrze napisać.
libGDX to naprawdę świetny wybór, ponieważ działa zarówno na głównych telefonach komórkowych, komputerach stacjonarnych, jak i na sieci (za pośrednictwem apletów lub kompilatora internetowego Google).
źródło
Obecnie buduję wieloplatformowy silnik gry. Używam SDL, która jest doskonałą (i odpowiednio niskim poziomem) biblioteką między platformami do budowania aplikacji graficznych, aby złagodzić ból.
Poza tym istnieje wiele „niestandardowego kodu” dla każdej platformy. Trzeba po prostu przejść. Odkryłem, że jest to bardzo niewielki ułamek mojego czasu programowania, głównie spędzonego na szukaniu dokumentów dla systemów, których nie znam tak dobrze jak mój macierzysty Linux.
Zniechęcam cię do używania
#ifdef
wszędzie w całym kodzie. Zamiast tego buduj abstrakcje wokół kluczowych operacji podstawowych (przykładem takiej operacji podstawowej może być gniazdo TCP).Gdy napotkasz nowy problem, który wymaga różnych rozwiązań w zależności od środowiska, zadaj sobie pytanie „czy mogę rozwiązać ten problem przy użyciu tylko prymitywów międzyplatformowych, które już zbudowałem?” Jeśli odpowiedź brzmi tak: voila, prosty wieloplatformowy kod. W przeciwnym razie dowiedz się, jakich prymitywów brakuje, i zaimplementuj je.
źródło
Jeśli chcesz to zrobić „od zera” jako doświadczenie edukacyjne, musisz użyć Win32 API, w którym możesz znaleźć informacje na temat otwierania okna i kontekstu OpenGL w MSDN i na wiki OpenGL ( http: // www .opengl.org / wiki / Creating_an_OpenGL_Context_ (WGL) ). W przypadku systemu Linux uzyskaj kopię podręcznika programowania O'Reilly Xlib i podręcznika referencyjnego Xlib, a także przeczytaj GLX (rozszerzenie OpenGL do systemu X Window). Zobacz także http://www.opengl.org/wiki/Tutorial:_OpenGL_3.0_Context_Creation_(GLX)
Następnie wystarczy podać ten sam interfejs API do aplikacji z funkcjami, które robią to samo (np. Otwierają okno), ale mają różne implementacje dla każdej platformy. Przepisujesz części silnika na różne platformy. Następnie grę, którą piszesz za pomocą silnika, musisz napisać tylko raz, ale będzie działać na różnych platformach.
źródło