Mam już rozsądne doświadczenie z C ++ i OpenGL, a ostatnio postanowiłem wypróbować tworzenie gier mobilnych. Po pomyślnym utworzeniu prostej aplikacji OpenGL ES na Androida przy użyciu Javy, szukałem sposobów, aby celować zarówno w Androida, jak i iOS przy jak najmniejszym przepisywaniu kodu. Próbowałem użyć dumnie prezentowanych wieloplatformowych narzędzi do tworzenia aplikacji Visual Studio 2015, ale okazało się, że są one zbyt nowe, a zatem bardzo niedokumentowane. Mógłbym zbudować projekty szablonów, które dał mi program, ale nie mogłem dowiedzieć się, w jaki sposób, biorąc pod uwagę te szablony, mogę dodać zasoby do gry lub obsłużyć dane z ekranu dotykowego.
Niestety, mam szczególne pragnienie, zbyt konkretne, by znaleźć je w Google. Chcę stworzyć grę OpenGL ES przy użyciu C ++ z cienkimi opakowaniami dla platform Android i iOS. Ludzie zadawali mi podobne pytania (choć nie dokładnie takie same), a więcej niż jedna osoba odpowiadająca stwierdziła, że to, co chcę zrobić, jest nie tylko możliwe, ale względnie łatwe, ponieważ nie muszę się martwić o interfejs użytkownika.
Wypróbowałem ten samouczek , ale ma on prawie trzy lata i dlatego prawdopodobnie jest przeznaczony dla starszych technologii, w wyniku czego wpadłem na różne niezliczone błędy. Jednak w tej chwili ten samouczek jest najbliższy temu, co chcę, że znalazłem. Cała reszta dotyczy wyłącznie systemu Android lub zaleca płacenie setek dolarów rocznie za korzystanie z zestawu Marmalade SDK. Czasami mam ochotę po prostu napisać kod dwa razy, raz w Javie, a raz w Objective-C, ale motywuje mnie wiedza, że takie rozwiązanie jest możliwe, ale z jakiegoś powodu nie zostało ono omówione w żadnym nowoczesnym szczególe.
Podsumowując, chcę stworzyć grę OpenGL ES na iOS i Androida, z jedną bazą kodu C ++ owiniętą niewielką ilością kodu specyficznego dla platformy. Jednak pomimo faktu, że kilka osób poleciło to podejście, nikt nie może mi powiedzieć, jak to zrobić. Czy ktoś może mi powiedzieć, czy to rzeczywiście możliwe, a jeśli tak, co mogę zrobić lub gdzie mogę się dowiedzieć, jak to zrobić?
Odpowiedzi:
Możesz znaleźć odpowiedź na podobne pytanie tutaj , aby być pomocnym.
Pomocne może być również sprawdzenie kodu źródłowego innych rozwiązań. Na przykład Godot Engine to wieloplatformowy silnik gry typu open source, więc nigdy nie musisz nic płacić.
Jak wspomniałem w mojej drugiej odpowiedzi , nie musisz (i prawdopodobnie nie możesz) polegać na jednym IDE, aby wykonać pracę za Ciebie. CMake , Scons i wiele innych narzędzi do budowania może pomóc w procesie kompilacji / kompilacji między platformami i IDE.
Na przykład Godot Engine używa Scons, a projekt LLVM (znany również jako framework kompilatora używany przez clang kompilatora C / C ++ / Objective-C) używa CMake .
Popularnym podejściem do gier jest budowanie silnika w C / C ++ i, jak wspomniałeś, abstrahowanie od specyfiki platformy. Jeśli chodzi o iOS i Androida, jest to logika zarządzania cyklem życia, która łączy się z systemem operacyjnym. Jeśli chcesz zrobić coś więcej i wykorzystać Emscripten do kompilacji do asm.js i zrealizować niemal natywną prędkość w przeglądarce, robisz coś podobnego z wyodrębnieniem głównej pętli za tym, co odpowiada wywołaniom requestAnimationFrame .
Emscripten zaleca użycie SDL w celu ułatwienia procesu przenoszenia, ponieważ może pomóc w obsłudze abstrakcyjnej specyfiki platformy, ale nic nie powstrzymuje cię przed zrobieniem tego samodzielnie (poza mnóstwem badań, debugowania itp.).
Jeśli jesteś naprawdę, naprawdę szalony, możesz robić to, co robię i pisać własny język, korzystając z mocy LLVM do kompilacji do natywnego C ABI lub nawet JIT na obsługiwanych platformach.
Chodzi o to, że tak, jest to rzeczywiście możliwe, ale niektóre drogi są bardziej skomplikowane / czasochłonne niż inne.
Uwaga: prawdopodobnie będziesz musiał używać Mac OSX przez Mac, VM lub Hackintosh z XCode, aby skompilować do iOS. To jeden z wielu powodów, dla których uważam Macbooka Pro za świetnego kandydata na system programistyczny.
Uwaga 2: Warto wspomnieć, że wiele silników wieloplatformowych używa obecnie języków skryptowych do logiki specyficznej dla gry. Unity nawet nie pozwala ci na przykład zbliżyć się do kodu źródłowego (chociaż możesz pisać natywne wtyczki). Może to pomóc przyspieszyć cykle programowania, a także ograniczyć przenoszenie do minimum, ponieważ języki skryptowe są dość niezależne od platformy (szczególnie interpretowane języki działające na maszynie wirtualnej). Celem mojego języka jest umożliwienie zarówno JIT (głównie dla oszczędności czasu programowania), jak i kompilacji statycznej.
Uwaga 3: Jeśli jeszcze tego nie wiesz. Jeśli nie korzystasz z SDL lub innego rozwiązania, które wyodrębnia specyfikę platformy, musisz użyć specyficznych funkcji interfejsu C / C ++ dla każdej platformy. W iOS jest to dość proste w XCode, ponieważ kompilator (klang jak wspomniano powyżej) już obsługuje C / C ++. W Androidzie musisz korzystać zpołączeń NDK i marshall między Javą a C / C ++.
źródło