Jak kodować interfejs użytkownika / interfejs użytkownika w systemie Entity?

18

Myślę, że już wpadłem na pomysł Entity System zainspirowany przez Adama Martina (t-machine). Chcę zacząć używać tego do mojego następnego projektu.

Znam już podstawy Entity, Components i Systems. Mój problem dotyczy sposobu obsługi interfejsu użytkownika / interfejsu użytkownika. Na przykład okno zadania, okno umiejętności, okno informacji o postaci itp. Jak radzisz sobie ze zdarzeniami interfejsu użytkownika (np. Naciśnięcie przycisku)? Są to rzeczy, które nie muszą być przetwarzane w każdej klatce. Obecnie używam MVC do kodowania interfejsu użytkownika, ale nie sądzę, że będzie kompatybilny z Entity System.

Przeczytałem, że Entity System jest osadzony na większym OOP. Nie wiem, czy interfejs użytkownika znajduje się poza ES, czy nie. Jak podejść do tego?

Sylpheed
źródło

Odpowiedzi:

17

Może za dużo myślisz w systemach bytów. Istoty mają na celu objęcie zasięgiem obiektów w grze, takich jak postacie, wrogowie, skrypty, pociski, wyzwalacze itp.

Może jeśli rozdzielisz interfejs użytkownika, będzie to znacznie lepsze i łatwiejsze. Nie musisz robić WSZYSTKIEGO w zakresie jednostek.

Gustavo Maciel
źródło
Tak też mówi Adam Martin w jednym ze swoich postów lub komentarzy na temat maszyny. ES jest rozwiązaniem konkretnego problemu. Może i powinien być używany razem z bardziej „tradycyjnymi” rozwiązaniami dla innych aspektów gry (silnika).
user8363
Dziękuję Ci. Po prostu nie jestem pewien, co powinno być w ES. Jak więc zakodować skuteczny interfejs użytkownika? Wydaje mi się, że MVC tego nie wycina, ponieważ mam problemy z hierarchią.
Sylpheed,
Widzę, że zgadzasz się używać innej architektury interfejsu użytkownika. Więc w czym problem z MVC?
Narek,
@Armen MVC nie ma problemów, ale umieszczenie go w zakresie encji ma. Po prostu jego zalety nie pokonają jego wad. Nie trzeba być astronautą architektury
Gustavo Maciel
3

Chociaż myślę, że interfejs Entity / Component może działać, trudno byłoby to zrobić. Ponadto jest wystarczająco daleko usunięty z komponentów i systemów, które miałbyś do przetwarzania bytów gry, w zasadzie byłby to po prostu inny byt / system składników w grze. Nie mogę sobie wyobrazić, że te dwa elementy będą się na siebie nakładały.

Systemy jednostek są niesamowite i używanie ich wszędzie może być kuszące. W końcu, kiedy dostajesz naprawdę słodki młotek, masz ochotę traktować wszystkie swoje problemy jak paznokcie. Jednak system EC jest tylko kolejnym narzędziem w twojej torbie do programowania. W przypadku problemów używanych do rozwiązania działa naprawdę dobrze, ale masz lepsze narzędzia do rozwiązywania problemów, takich jak interfejs użytkownika.

Struktura dziedziczenia działa bardzo dobrze w przypadku GUI. Nie tylko do tworzenia komponentów interfejsu użytkownika, ale także do ich rozmieszczania. Naprawdę miło jest mieć możliwość, aby komponenty interfejsu użytkownika były potomkami innych komponentów, aby mogły dziedziczyć właściwości takie jak pozycja, skala i krycie. Jeśli spróbujesz skonfigurować system EC, będziesz musiał złamać niektóre zasady systemu EC.

MichaelHouse
źródło
1

Możesz utworzyć nową funkcję interfejsu, która jest wywoływana przy każdym rysowaniu interfejsu użytkownika / interfejsu użytkownika i zezwalać komponentom niestandardowym / skryptowym na implementację tej funkcji. Wymaga to użycia systemu IMGUI (w Google jest wiele samouczków, jest to tylko oryginalna prezentacja). Dzięki temu możesz tworzyć okna jako elementy, w których będziesz mieć swój własny komponent budowania interfejsu użytkownika i komponent renderujący ramę okna.

Jeśli chodzi o nieprzetwarzanie tego wszystkiego w każdej ramce, możesz wyrenderować cały interfejs użytkownika w innym buforze, który będziesz aktualizować tylko dla wszelkiego rodzaju zdarzeń wejściowych / danych. Oznacza to, że za każdym razem, gdy odbierane jest zdarzenie, zmienia ono pewną zmienną, aby wskazać, że okno wymaga odmalowania następnej klatki. Jeśli ta zmienna jest prawdziwa, wówczas jest ustawiona na false, a następnie wywoływane są interfejsy interfejsu użytkownika. Jeśli potrzebujesz animacji, ważne jest, abyś używał tej dokładnej kolejności operacji, aby sam interfejs użytkownika mógł wywołać odmalowanie następnej klatki.

snake5
źródło