2016-06-22 51 views
5

Po pierwsze przepraszam za długi post. Zadaję kilka pytań o haxe i jego przydatność jako narzędzia do rozwiązania problemu, z którym się borykam. Mam bardzo ograniczoną wiedzę o haxe, ale wiem, że moja idealna rola dla haxe w moim projekcie nie jest normalnym użyciem haxe. Więc staram się unikać marnowania czasu, ponieważ nie uczę się tego języka (pomimo tego, że wygląda to naprawdę zabawnie i wydajnie) tylko po to, aby przekonać się, że nie nadaje się do tego celu. Mam nadzieję, że otrzymasz od weterynarza porady na temat tego, czy nadają się do tego celu. Naprawdę mam nadzieję, że tak jest.Używanie haxe jako transpilera między C++ a JavaScriptem

Oto co usiłuję osiągnąć:

Pracuję w branży gier i muszę stworzyć grę zarówno w C++ i JS. C++ dla systemu wbudowanego i JS dla Internetu i urządzeń mobilnych. Mam duże doświadczenie zarówno w C++, jak i JS.

Gry, które rozwijam Chcę napisać tylko raz. Teraz mógłbym użyć czegoś takiego jak emscripten do przechodzenia z C++ do JS, ale spowoduje to skompilowany kod JS, który nie będzie mógł być debugowany za pomocą narzędzi do Chrome. Jestem converned, że wpadnę na błędy krawędzi krawędzi z kompilowanym JS, którego nie mogę łatwo powrócić do oryginalnego C++. Ponadto niektóre platformy do gry wymagałyby laboratoriów uczciwości, aby zobaczyć kod źródłowy, który byłby problemem dla skompilowanego JS.

To, czego naprawdę potrzebuję, to źródło do kompilatora, który produkuje natywny i czytelny dla człowieka kod C++ i JS, z którym będę mógł pracować i modyfikować w swojej natywnej formie, jeśli będzie to konieczne, stąd haxe. Spojrzałem na kod produkowany przez haxe dla C++ i JS. JS wygląda na łatwego do zrozumienia i pracy. C++ nie tak bardzo, ale wciąż prawie do zaakceptowania. Mogę nawet powstrzymać haxe od kompilowania i łączenia C++, którego nie potrzebuję. Chcę tylko kodu źródłowego.

Jak dotąd tak dobrze.

Teraz mam framework gry w C++, który wykorzystuje silnik Oxygine 2d. Jest w stanie pokazywać sprite'y itp., Jak również ramy, które stworzyłem dla magistrali komunikatów i skończonych maszyn stanów (ładuje również bardziej użyteczne klasy). Mam również podobne ramy w JS, który używa Pixijsa do jego silnika 2d i ma własną magistralę komunikatów itp., Podobnie jak silnik C++.

Teraz, co chcę zrobić, to pisać moduły w haxe, które po transpozycji do C++ i JS, że kod może być włączony jako część struktury i pracować z jej szanowanym silnikiem językowym. Każdy obiekt, który utworzę w haxe, będzie bardzo enkapsulowany i będzie po prostu musiał zasubskrybować magistralę komunikatów, obsługiwać wiadomości i wysyłać wiadomości z powrotem. Może również potrzebować wiedzy na temat korzystania z jego maszyny stanu silnika. Tak więc nie mam pojęcia, czy jest to możliwe z haxe, ponieważ magistrala komunikatów (wraz z innymi obiektami) nie zostanie zapisana w haxe, ale zostanie dostarczona do modułu po tym, jak zostanie on transponowany i wbudowany w swój macierzysty projekt. Może mogę napisać własną bibliotekę haxe, która zna składnię moich dwóch silników gier i może przenosić w zależności od języka docelowego? Nie jestem pewien, czy to możliwe.

Dziękujemy za poświęcenie czasu na przeczytanie i porady, które można udzielić.

+0

Myślę, że Haxe jest stworzony właśnie z tego powodu. Myślę, że twoje pytanie jest bardzo szerokie, ale możesz dokonać rozróżnienia między tym, co jest używane w C++/js przy użyciu kompilacji warunkowej. Oznacza to, że powinieneś zrobić '#if js' lub' #if cpp' Zobacz http://haxe.org/manual/lf-condition-compilation.html –

+0

Próbowałem osiągnąć coś podobnego (skompiluj Haxe do C++ i zaimportuj moje Moduły Haxe w istniejącym projekcie C++), ale na IRC#Haxe, ludzie zdecydowanie odradzają to robić. Z tego, co odkryłem po pewnym wyszukiwaniu, myślę, że mają całkowitą rację. Wyjaśnili mi, że wygenerowany kod C++ jest idealny do bezpośredniego kompilowania przez kompilator C++, ale nic więcej. –

+0

Istnieje [inna istotna dyskusja] (https://groups.google.com/forum/#!topic/haxelang/gSnoTKv7HEY) na temat transpilera C++ do Haxe. –

Odpowiedz

1

Można użyć

#if cpp 
// c++ implementation 
#elseif js 
// javascript implementation 
#end 

aby umożliwić pewne różne implementacje dla różnych celów, to może przejść w dowolnym miejscu w kodzie, więc można przekazać wartość haXe do różnych funkcji dla różnych celów.

Aby używać extern definicje:

z C++ konkretnie to może być bardziej skomplikowane trzeba spojrzeć na CFFI lub Linc https://snowkit.github.io/linc/
Złożoność jest prawdopodobnie uzyskiwanie typów w poprzek. Pamiętaj, że Haxe C++ zarządza pamięcią, twój silnik może robić różne rzeczy. Niedługo pojawi się HL i może mieć pewne zalety.

Patrząc na oxygine2d wygląda trochę jak Flash API? I wiem, że pixijs opiera się mniej więcej na Flash API. Wierzę, że OpenFL używa teraz pixijs do renderowania WebGL. Możesz również spojrzeć na NME (ma prawie taki sam interfejs dla C++ jak OpenFL, ale NME ma takie rzeczy jak konfiguracja Cppia i czasami jest bardziej stabilny). Jeśli JS lub C++ jest zbyt wolny, musisz zajrzeć do shaderów i Luxe/Kha dla renderowania i możesz również spróbować Heapsa używającego Lime (openfl) i trochę haxe js webgl.
Jeśli potrzebujesz fizyki 2D, a następnie użyj Nape, możesz go użyć z dowolnym zestawem narzędzi Haxe (Luxe, OpenFL, Kha, Flambe), ale jest to fizaxe, ale to nie jest używane tak często. Kha i karku informacji np: https://github.com/lewislepton/kha-examples/blob/master/NAPE/Sources/Project.hx

Naprawdę podejrzewasz, że czyniąc swoje życie ciężko, chcąc korzystać z różnych silników dla różnych platform, kiedy prawdopodobnie HaxeFlixel lub Punk mogłeś dać wszystko, czego potrzebują działa z Nape na jednym przekroju tarczy zestawy narzędzi, ale bardzo możliwe jest zrobienie tego po swojemu.

Może wyglądać na Tink lub Thx dla magistrali zdarzeń sygnałów i tym podobnych, makra (takie jak używane w Tink) pozwalają na budowanie wielu struktur podczas kompilacji, a więc mogą zmniejszyć dużo narzutu, robiąc to przed uruchomieniem , więc animacje mogą być wstępnie obliczone przez kompilator. Istnieje debugger hxcpp i jeśli uruchomisz Haxe w chrome, powinieneś podać numer linii Haxe poprzez mapowanie źródła js.

Mam nadzieję, że omówiłem niektóre aspekty waszego dużego pytania.

Haxe pozwala mieszać i dopasowywać z natywnym, ale myślę, że do korzystania z Pixijs i Oxygine 2d prawdopodobnie nie jest idealny, ponieważ istnieje wystarczająco dużo dobrych narzędzi do gry w czystej Haxe z wbudowanymi optymalizacjami docelowymi, wystarczy przejdź do Kha IRC, Luxe gitter, Haxe IRC i forum OpenFL i zadaj kilka pytań.