Jaką bibliotekę GUI C ++ możesz zasugerować? [Zamknięte]


26

Buduję własny silnik gry w C ++ i obecnie decyduję o tym, jakiego interfejsu użytkownika powinienem użyć.

Czy powinienem korzystać z biblioteki? Czy powinienem zrobić własny?


3
Nie jest jasne, co masz na myśli: GUI w grze? Lub GUI dla narzędzi? Każdy z nich ma inne wymagania.
jacmoe

1
Kto potrzebuje narzędzi, gdy masz silnik (epicka muzyka)
Ricket

1
jeśli potrzebujesz tylko modalnych okien dialogowych, małe okna dialogowe plików w sourceforge to pojedynczy plik międzyplatformowy C C ++, który można dodać do projektu. bez init, bez głównej pętli
tinyfiledialogs

Odpowiedzi:


11

W rzeczywistości widżety Qt można zintegrować z OpenGL, a OpenGL można łatwo zintegrować z Qt (QGLWidget). Oczywiście natywnie wyglądające widżety platformy mogą nie być dokładnie tym, czego szukasz, ale nie martw się, istnieją sposoby na ich dostosowanie, stworzenie własnego lub użycie czegoś innego, który lepiej spełni twoje potrzeby, takiego jak Qt Quick (który powinieneś być również w stanie zintegrować się).

Jeśli jesteś zainteresowany, nie przegap tych linków: Widżety wchodzą w trzeci wymiar: WolfenQt i Przyspiesz swoje widżety za pomocą OpenGL


9

Nie sądzę, że powinieneś pisać własne, zadanie tworzenia silnika gry jest samo w sobie tak ogromne, jeśli w pobliżu jest wiele bibliotek z dobrymi licencjami, których możesz użyć i zmodyfikować według własnych upodobań.

W przypadku silnika gry wybrałbym GUI w trybie natychmiastowym. Więcej informacji tutaj: http://www.mollyrocket.com/forums/viewtopic.php?t=134

Kluczową ideą jest narysowanie komponentu i jednoczesne kontrolowanie interakcji:

if (button(id, position, size)) 
{
    button_was_pressed();
}

Po pierwsze, Unity stosuje podobną koncepcję.

Możesz znaleźć implementację firmy NVIDIA, wykorzystaną w jej pokazach: http://code.google.com/p/nvidia-widgets/


4
IM GUI to ciekawa koncepcja, ale zauważyłem, że pojawiają się pewne problemy, które pojawiają się podczas próby gry. Jeśli chcesz, aby elementy menu były animowane we / wy, musisz albo zrobić coś takiego, jak zmodyfikować indywidualne położenie wszystkich widżetów lub coś takiego, jak zmodyfikować macierz transformacji GUI dla tego wywołania. Byłoby łatwiej, gdybyś miał na przykład kontener Windows, którego działania są tłumaczone na jego dzieci i tak dalej. Z jakiegoś powodu większość implementacji IMGUI nie ma stanów „wyłączonych” widgetów.
Tetrad

@Tetrad: Bardzo łatwo jest wdrożyć grupy widżetów z automatycznym układem, pozycjami względnymi lub pozycjami bezwzględnymi (widżety Nvidia to robią.) Pozwala to bardzo łatwo zawierać widżety w oknach lub panelach. Dla stanu „wyłączonego” nie widzę, dlaczego nie byłoby to trywialnie zaimplementowane. W przypadku „grywalnych rzeczy” myślę, że koncepcje trybu natychmiastowego są w rzeczywistości bardziej odpowiednie niż tryb zatrzymany, ponieważ widżety są aktualizowane co każdą klatkę.
Oskar N.

7

Osobiście polecam CEGUI . Jest open source i całkiem nieźle. Trzeba jednak pamiętać, że jeśli wszystko wypiszesz ręcznie, może być bardzo, bardzo gadatliwe.

Ale na plus ma renderery zarówno dla OpenGL, jak i DirectX. Udało mi się umieścić go na szablonie, którego zwykle używam, który zapisuje teksturę bezpośrednio przy użyciu VBO (to trochę hacky).

Ta gra była przeznaczona do pracy w sieci. Zadanie polegało na stworzeniu sieciowej gry z lobby. Wiedziałem, że lobby będzie kłopotem z szyją, więc wybrałem bibliotekę, która zrobiła dla mnie większość.


Tego właśnie używam. Uważam jednak, że ma zbyt wiele zależności. I miałem problem z powiązaniem go z moim projektem (IIRC, licencja mówi, że mogę tylko link do biblioteki)
MrValdez

6
Ma absurdalną liczbę zależności. Nadęła moja mała gra demo do 50 MB!
knight666,

Co? Myślę, że robisz to źle :) Waga bibliotek DLL CEGUI w mojej grze jest mniejsza niż 3 MB. I do MrValdez: CEGUI jest na licencji BSD ..
jacmoe

Licencja MIT - przepraszam. CEGUI jest na licencji MIT. :)
jacmoe,

5

Problem z większością bibliotek GUI (Qt jest prawdopodobnie najpopularniejszą wersją C ++, która nie jest przeznaczona tylko dla systemu Windows) polega na tym, że większość nie integruje się dobrze z silnikiem. Tradycyjnie w aplikacji GUI biblioteka GUI kontroluje główną pętlę, a Ty po prostu podłączasz wywołania zwrotne do zdarzeń. W silniku gry zazwyczaj chcesz kontrolować pętlę, więc może to być co najwyżej trudne. Może szukasz czegoś, co po prostu poradzi sobie z kontrolkami do rysowania i oknami dialogowymi, i tak w kontekście 3D, który przekażesz? Mogą być znacznie trudniejsze do znalezienia: - /


<pedantic> wxWidgets jest również wieloplatformowy </pedantic>, choć uważam, że chodzi o integrację silnika
zebrabox

3
Powiedziałem „najbardziej popularny”, a nie „tylko” :-P wx ma jeszcze mniej wsparcia dla pracy z kontekstami 3D, kiedy ostatnio szukałem.
coderanger

4

Mocno wierzę w pisanie własnych, ale znowu jestem bardzo oldskool. Walka z kolejną biblioteką GUI, aby zrobić tylko to, co chcesz, doprowadza mnie do szału, dodając do tego fakt, że większość graficznych interfejsów gry jest dość trywialna, więc nie musisz iść na całość w projektowaniu MDI i super OO, gdzie Przyciski mogą mieć widoki przewijania, które wyróżniają się, gdy najedziesz myszką na pasek zadań z boku pola wyboru za pomocą przeciąganych kciuków - lub coś w tym rodzaju. Chyba różne pociągnięcia dla różnych ludzi.


zdarzają się sytuacje, w których „napisz własne” nie jest tak nie na miejscu, jak mogłoby się wydawać. Gra, w której ważny jest interfejs użytkownika, np. Gry do zarządzania lub gry RPG ze złożonym zarządzaniem przedmiotami; interfejs użytkownika byłby ogromną częścią tego doświadczenia. joelonsoftware.com/articles/fog0000000007.html Jeśli jest to podstawowa funkcja biznesowa - zrób to sam, bez względu na wszystko
v.oddou

3

Jedną z opcji, którą warto zbadać, jest użycie WebKit do renderowania interfejsów użytkownika i zrobienie całego interfejsu użytkownika za pomocą CSS / HTML / Javascript.

Oto implementacja open source (Berkelium) , a tutaj jest komercyjna implementacja zamkniętego źródła (Awesomium)


5
WebKit i jego krewni są bardziej nastawieni na częstotliwość odświeżania raz lub dwa razy na sekundę, może być trudne wykonanie HUD dla gry zorientowanej na działanie w ten sposób. Byłoby jednak świetne dla menu lub wolniejszych bitów.
coderanger

1
@coderanger: Możesz pisać całe gry w JavaScript / HTML5. Opublikowałem komercyjną grę akcji dla Chrome Web Store, która działa przy 60 FPS w porządku w WebKit / Chrome.
Sean Middleditch


3

Osobiście używam CEGUI w moim projekcie gry i jest to dość solidne rozwiązanie. Problem w tym, że czasami wydaje się, że wystarczy jedna drobna zmiana twoich zmieniających się ton plików.

Nie korzystałem z niego, ale libRocket po prostu stał się całkowicie darmowy, usuwając wszystkie opłaty licencyjne i co nie. Fajną częścią tej biblioteki jest to, że piszesz ją w składni HTML / CSS. http://librocket.com


2

Po prostu podnosząc ciekawą sugestię, jeśli tworzysz grę dla systemu Windows, użyj Win32 API. Wystarczy użyć zwykłych kontrolek systemu Windows (zaleciłbym użycie bibliotek ATL / WTL), ale narysuj ich właściciela.

Widziałem tę technikę w pierwszej grze Unreal Tournament, przeglądając publicznie wydane nagłówki (dla twórców modów).

Jedną z kluczowych korzyści z tego jest dysponowanie całą infrastrukturą interfejsu użytkownika systemu Windows, a także utrzymanie preferencji użytkownika dotyczących częstotliwości powtarzania klawiatury, czułości myszy, szybkości podwójnego kliknięcia i innych rzeczy. Ponadto, jeśli będziesz przestrzegać zasad, interfejs będzie szybki i wolny od migotania.

Wadą jest to, że nadal będziesz musiał napisać kod, aby podklasować kontrolki systemu Windows, aby ich właściciel rysował, abyś mógł zastosować do nich własną grafikę i efekty.

Wyrzucam to jako pomysł.


1
Wierzę, że Win32 / COM jest emulowany w systemie Vista i Win 7. Nie jest zalecany do wysokiej wydajności ...
Stephen Furlani

Myślę, że to zależy od tego, ile GUI użyjesz w grze. Jeśli to tylko dla systemu menu, to kogo to naprawdę obchodzi, jeśli używasz go intensywnie w kluczowej sekcji liczby klatek, to wymaga trochę pracy i przemyślenia.
Daemin,

@StephenFurlani Win32 / COM nie jest emulowany w systemie Vista i Windows 7, jest natywny i działa z pełną prędkością. Ponadto ATL / WTL nie polega na COM, ale DirectX.
Daemin,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.