W ciągu ostatnich kilku lat dokonano kilku naprawdę przełomowych odkryć w zestawach narzędzi głównego interfejsu użytkownika. Interfejsy gry również ewoluują, ale w nieco wolniejszym tempie. Jest to prawdopodobne, ponieważ opracowanie w pełni funkcjonalnego podsystemu interfejsu użytkownika jest samo w sobie znaczącym przedsięwzięciem i trudno uzasadnić inwestycję w zasoby.
Moim osobistym ulubionym systemem interfejsu użytkownika jest Windows Presentation Foundation (WPF). To naprawdę przenosi potencjał różnicowania interfejsu użytkownika na wyższy poziom. Oto niektóre z jego ciekawszych funkcji:
Elementy sterujące są domyślnie „pozbawione wyglądu”. Logika i wygląd kontrolki są na ogół oddzielone. Każda kontrolka jest dostarczana z domyślnym stylem i szablonem, który opisuje jej domyślny wygląd. Na przykład przycisk może być reprezentowany jako zaokrąglony prostokąt z zewnętrznym obrysem, jednolitym kolorem lub gradientem tła oraz prezenter zawartości (do przedstawienia podpisu). Programiści (lub projektanci) mogą tworzyć szablony niestandardowych stylów, które zmieniają wygląd i (do pewnego stopnia) zachowanie kontrolki. Stylów można używać do nadpisywania prostych właściwości kontrolki, takich jak kolor pierwszego planu / tła, szablon itp .; szablony zmieniają faktyczną strukturę wizualną.
Style i szablony mogą zawierać „Wyzwalacze”. Wyzwalacze mogą nasłuchiwać określonych zdarzeń lub wartości właściwości (lub kombinacji wartości) i warunkowo zmieniać aspekty stylu lub szablonu. Na przykład szablon przycisku miałby zwykle wyzwalacz we właściwości „IsMouseOver” w celu zmiany koloru tła, gdy kursor myszy znajdzie się nad przyciskiem.
Istnieje kilka różnych „poziomów” elementów interfejsu użytkownika, od elementów o mniejszej wadze z minimalną funkcjonalnością do pełnowymiarowych ciężkich elementów sterujących. Daje to pewną elastyczność w strukturze interfejsu użytkownika. Najprostsza z klas elementów interfejsu użytkownika UIElement
, nie ma stylu ani szablonu i obsługuje tylko najprostsze zdarzenia wejściowe. W przypadku prostych elementów, takich jak wskaźniki stanu, ta funkcja może być wszystkim, czego potrzebujesz. Jeśli potrzebujesz szerszej obsługi danych wejściowych, możesz czerpać z nich FrameworkElement
(co się rozszerza UIElement
). Zwykle pochodzą od tradycyjnych widżetów Control
, które rozszerzają FrameworkElement
i dodają niestandardowe style i obsługę szablonów (między innymi).
WPF wykorzystuje zachowany, skalowalny, niezależny od rozdzielczości model grafiki wektorowej. W systemie Windows aplikacje WPF są renderowane i tworzone przy użyciu Direct3D.
Wprowadzenie WPF obejmowało nowy deklaratywny język programowania o nazwie Xaml. Xaml, oparty na Xml, jest preferowanym językiem do deklarowania „scen” interfejsu użytkownika. W rzeczywistości jest dość zręczny i chociaż na pierwszy rzut oka może wydawać się podobny, zasadniczo różni się od istniejących języków, takich jak XUL (i znacznie potężniejszy).
WPF ma bardzo zaawansowany podsystem tekstowy. Obsługuje większość, jeśli nie wszystkie funkcje czcionek OpenType, dwukierunkowe antyaliasing ClearType, pozycjonowanie subpikseli itp.
„Ok, świetnie, jak to się ma do tworzenia gier?”
Kiedy WPF był jeszcze w fazie rozwoju (i znany jako „Avalon”), brałem udział w kursie projektowania gier wideo w Georgia Tech. Mój ostatni projekt był turową grą strategiczną i chciałem mieć bardzo sprawny interfejs użytkownika. WPF / Avalon wydawało się dobrym szlaku iść, ponieważ miała komplet pełni funkcjonalny kontroli i to mi możliwość gry całkowicie zmienić wygląd tych kontroli. Rezultatem była gra z pięknym i wyraźnym interfejsem użytkownika o poziomie funkcjonalności, który zwykle widzi się tylko w pełnoprawnych aplikacjach.
Problem z użyciem WPF do gier polega na tym, że jest dość ciężki i renderuje we własnym „piaskownicy”. Rozumiem przez to, że nie ma obsługiwanego sposobu hostowania WPF w środowisku gier Direct3D lub OpenGL. Możliwe jest hostowanie treści Direct3D w aplikacji WPF, ale będziesz ograniczony przez ilość klatek na sekundę aplikacji WPF, która jest ogólnie niższa niż byś chciał. W przypadku niektórych rodzajów gier, takich jak gry strategiczne 2D (zrzut ekranu z mojego obecnego projektu gry WPF), może nadal działać świetnie. Cokolwiek innego, nie tak bardzo. Ale nadal możesz zastosować niektóre z bardziej przekonujących koncepcji architektonicznych WPF przy opracowywaniu własnego frameworku interfejsu użytkownika.
Istnieje również otwarta, niezarządzana implementacja C ++ / Direct3D WPF o nazwie „WPF / G (WPF dla gier)”] ( http://wpfg.codeplex.com/ ), która jest specjalnie zaprojektowana do użytku w grach na obu systemach Win32 i Windows Mobile. Wygląda na to, że aktywne tworzenie się zakończyło, ale kiedy ostatni raz to sprawdziłem, było to raczej pełne wdrożenie. Podsystem tekstowy był jedynym obszarem, którego naprawdę brakowało w porównaniu z implementacją WPF Microsoftu, ale to mniejszy problem dla gier. Wyobrażam sobie, że zintegrowanie WPF / G z silnikiem gry opartym na Direct3D byłoby stosunkowo proste. Wybranie tej trasy może zapewnić niezwykle sprawny, niezależny od rozdzielczości framework interfejsu użytkownika z szerokim wsparciem dostosowywania interfejsu użytkownika.
Aby pokazać, jak może wyglądać interfejs użytkownika gry opartej na WPF, oto zrzut ekranu z mojego projektu dla zwierząt domowych: