Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Tworzenie interfejsu programu, przekazywanie "eventu" do odpowiedniego objektu i template obiektu.

Ostatnio zmodyfikowano 2023-04-10 21:48
Autor Wiadomość
befejak
Temat założony przez niniejszego użytkownika
Tworzenie interfejsu programu, przekazywanie "eventu" do odpowiedniego objektu i template obiektu.
» 2023-04-07 19:30:52
Witam,
 Ostatnio staram się zrobić program który będzie posiadać mój własny interfejs, czyli przyciski, checkboxy, menu, listy itp.

Stworzyłem więc klasę którą nazwałem "qlCanvas"
 qlCanvas posiada polimorficzny wskaźnik typu qlCanvasUnit, wszystkie elementy interfejsu korzystają z tej klasy jako bazowej.
 Obecnie posiadam 3 typy interfejsu, Slider, Button oraz Checkbox.

Posiadam również klasę qlAction

Za każdym razem jak użytkownik naciśnie jakiś przycisk jest on wysyłany z CallBack-u do qlAction, robotą qlAction jest
aby zdecydować który Canvas otrzyma ten event, i tutaj pojawia się niewielki problem.

Każdy qlAction czyta eventy z zarejestrowanego do niego CallBack-u ( z okna )
Każdy qlCanvas musi być zarejestrowany do qlAction ( inaczej nie otrzyma żadnych eventów )
Każdy qlCanvasUnit jest polimorficznym wskaźnikiem w qlCanvas


Przyjmijmy że robić grę komputerową, na dole ekranu mam przyciski które mogę kliknąć, a WASD mogę poruszać się po świecie.
 Ale podczas naciśnięcia Enter-a powinien uruchomić się qlCanvas "Chat / Konsola"

Od momentu otwarcia Czatu / konsoli WASD powinno przestać działać, a każdy input powinien być od teraz kierowany do konsoli.

Z tym problemu wielkiego nie mam, ale chciałbym wysłuchać czy ktoś posiada jakieś lepsze rozwiązania tego problemu,
 Obecnie posiadam wskaźnik który przestawia się na Canvas który ma otrzymywać eventy

 Jeśli Wskaźnik == NULL, event kierowany jest do qlAction ( czyli defaultowe eventy )
 Jeśli wskaźnik == AnyCanvas, zamiast Action, event kierowany jest do Canvas-u z wskaźnika.


Ale tutaj pojawia mi się inny problem, co z wieloma pojawiającymi się okienkami?

Przyjmijmy że posiadam ( a posiadam ) mini tutoriale które pojawiają się w prawym dolnym rogu ekranu,
 Tutorial w skrócie opowiada o tym jak gra działa a gracz może użyć przycisku "Q" aby zamknąć okienko
 lub kliknąć X aby zamknąć / kliknąć przycisk na dole aby przeczytać więcej.

I z tym mam niewielki problem bo nie bardzo wiem jak mógłbym to zrobić optymalnie i aby nie tworzyć 256 eventów
 dla każdego nawet małego przycisku ( bo tak właśnie teraz robię ), tworzę nową listę 256 eventów dla każdego Canvasu.


Przy okazji, bo obecnie używam w moim qlCanvasUnit template
C/C++
template < typename T >
class qlCanvasUnit {
public:
Bo różne obiekty interfejsu posiadają różne statystki,
 np.
 Przycisk posiada tylko swoje wymiary i pozycję,
 Checkbox posiada to samo co przycisk ale również jego stan ( YES / NO )
 Slider posiada jeszcze więcej i między innymi wartość 0 / 256 ( short ) ( szerokość slidera, wielkość przycisku itp. )

Obecnie wszystko ustawiam poprzez osobną funkcję, czyli najpierw robię nowy przycisk itp. potem osobno wywołuję
funkcję aby ustawić "startowe" parametry tego elementu, wiem że mógłbym zrobić:
template < typename T, int a, int b, int c ... >

Tylko w tym przypadku pojawia się problem że nie wszystkie elementy mają taką samą ilość atrybutów,
 oraz niektóre z nich w przyszłości mogą mieć np. tekst na sobie albo obrazek... co wtedy?


Więc moje drugie pytanie czy da się jakoś przekazać wartości do konstruktora z typu którego używamy w Template?
 Czy może jednak wywołanie osobno funkcji po utworzeniu go to jedyna opcja?


Nie wiem czy dostatecznie jasno określam czego potrzebuję.
 Mam nadzieję że jeśli rozumiecie to otrzymam jakąś pomoc :) A jeśli trzeba to wyjaśnię więcej.
P-180101
DejaVu
» 2023-04-09 12:20:49
1. Unikaj template-ów jeżeli nie jest to kontenery lub parametr funkcji/metody. Dziedziczenie + szablony = nieutrzymywalny kod.

2. Tworzenie engineu GUI to sztuka sama w sobie więc trudno dać Ci jakąś radę. Możesz zobaczyć jak inne silniki są zaprojektowane i powielić ich rozwiązanie lub pokombinować sobie kreatywnie jak to obecnie robisz.
P-180103
befejak
Temat założony przez niniejszego użytkownika
» 2023-04-10 14:33:38
To całkiem dobry pomysł aby popatrzeć jak inni rozwiązali to w swoim Silniku.
 Pobrałem sobie Kod źródłowy Unity, z początku chciałem Unreal Engine, ale EpicTeam skomplikowało wszystko strasznie.
 Source Code Unity da się od tak pobrać z GitHub-a a Unreal ma jakieś setki wymagań i licencji.

Zabawne że Unity również używa nazwy "Canvas", Kod źródłowy posiada kilkaset mniejszych plików więc jeszcze je czytam.

Poleciłbyś jakieś inne silniki których kod można zobaczyć a które nie wymagają jak Unreal Engine bycia ich subskrybentem itp.?
P-180105
DejaVu
» 2023-04-10 21:01:15
Ja bym pewnie googlował i szukał bibliotek GUI do gier w C++.
P-180106
pekfos
» 2023-04-10 21:48:20
Jak na razie mowa o samym GUI, to może imgui?
P-180107
« 1 »
  Strona 1 z 1