Il y a eu des percées très intéressantes dans les boîtes à outils d'interface utilisateur traditionnelles au cours des dernières années. Les interfaces utilisateur de jeu ont également évolué, mais à un rythme un peu plus lent. Cela est probablement dû au fait que le développement d'un sous-système d'interface utilisateur complet est une entreprise importante en soi, et il est difficile de justifier l'investissement en ressources.
Mon système d'interface utilisateur préféré personnel est Windows Presentation Foundation (WPF). Cela prend vraiment le potentiel de différenciation de l'interface utilisateur au niveau suivant. Voici certaines de ses fonctionnalités les plus intéressantes:
Les contrôles sont "sans apparence" par défaut. La logique et l'apparence visuelle d'un contrôle sont généralement découplées. Chaque contrôle est livré avec un style et un modèle par défaut, qui décrivent son apparence visuelle par défaut. Par exemple, un bouton peut être représenté par un rectangle arrondi avec un trait extérieur, une couleur unie ou un arrière-plan dégradé et un présentateur de contenu (pour présenter la légende). Les développeurs (ou concepteurs) peuvent créer des modèles de styles personnalisés qui modifient l'apparence et (dans une certaine mesure) le comportement d'un contrôle. Les styles peuvent être utilisés pour remplacer les propriétés simples d'un contrôle, comme la couleur de premier plan / d'arrière-plan, le modèle, etc.; les modèles changent la structure visuelle réelle.
Les styles et modèles peuvent inclure des "déclencheurs". Les déclencheurs peuvent écouter certains événements ou valeurs de propriété (ou combinaisons de valeurs) et modifier conditionnellement les aspects d'un style ou d'un modèle. Par exemple, un modèle de bouton aurait généralement un déclencheur sur la propriété "IsMouseOver" dans le but de changer la couleur d'arrière-plan lorsque la souris survole le bouton.
Il existe différents "niveaux" d'éléments de l'interface utilisateur, allant des éléments plus légers avec une fonctionnalité minimale aux commandes lourdes à part entière. Cela vous donne une certaine flexibilité dans la façon dont vous structurez votre interface utilisateur. La plus simple des classes d'éléments d'interface utilisateur UIElement
, n'a pas de style ou de modèle et prend uniquement en charge les événements d'entrée les plus simples. Pour les éléments simples comme les indicateurs d'état, cette fonctionnalité peut être tout ce dont vous avez besoin. Si vous avez besoin d'un support d'entrée plus étendu, vous pouvez dériver de FrameworkElement
(qui s'étend UIElement
). Les widgets traditionnels dérivent généralement de Control
, ce qui étend FrameworkElement
et ajoute un support de style et de modèle personnalisé (entre autres).
WPF utilise un modèle graphique vectoriel conservé, évolutif et indépendant de la résolution. Sous Windows, les applications WPF sont rendues et composées à l'aide de Direct3D.
L'introduction de WPF a inclus un nouveau langage de programmation déclarative appelé Xaml. Xaml, basé sur Xml, est le langage préféré pour déclarer des "scènes" d'interface utilisateur. Il est en fait assez lisse, et bien qu'il puisse sembler similaire à première vue, il est fondamentalement différent des langages existants comme XUL (et beaucoup plus puissant).
WPF possède un sous-système de texte très avancé. Il prend en charge la plupart sinon toutes les fonctionnalités de police OpenType, l'anticrénelage ClearType bidirectionnel, le positionnement des sous-pixels, etc.
"Ok, super, maintenant comment est-ce pertinent pour le développement de jeux?"
À l'époque où WPF était encore en développement (et connu sous le nom de "Avalon"), je suivais un cours de conception de jeux vidéo à Georgia Tech. Mon projet final était un jeu de stratégie au tour par tour, et je voulais une interface utilisateur très performante. WPF / Avalon semblait être une bonne voie à suivre, car il disposait d'un ensemble complet de commandes complètes et me permettait de changer complètement l'apparence de ces commandes. Le résultat a été un jeu avec une interface utilisateur belle et nette avec le niveau de fonctionnalité que vous ne voyez normalement que dans les applications à part entière.
Maintenant, le problème avec l'utilisation de WPF pour les jeux est qu'il est assez lourd et s'affiche dans son propre "bac à sable". Par cela, je veux dire qu'il n'y a aucun moyen pris en charge d'héberger WPF dans un environnement de jeu Direct3D ou OpenGL. Il est possible d'héberger du contenu Direct3D dans une application WPF, mais vous serez limité par la fréquence d'images de l'application WPF, qui est généralement inférieure à celle que vous souhaitez. Pour certains types de jeux, comme les jeux de stratégie 2D (capture d'écran de mon projet de jeu WPF actuel), cela pourrait encore très bien fonctionner. Pour rien d'autre, pas tant. Mais vous pouvez toujours appliquer certains des concepts architecturaux les plus convaincants de WPF dans le développement de votre propre cadre d'interface utilisateur.
Il existe également une implémentation open source, non gérée C ++ / Direct3D de WPF appelée "WPF / G (WPF for Games)"]] ( http://wpfg.codeplex.com/ ) spécialement conçue pour être utilisée dans les jeux sur Win32 et Windows Mobile. Le développement actif semble avoir cessé, mais la dernière fois que je l'ai vérifié, c'était une implémentation plutôt complète. Le sous-système de texte était le seul domaine qui manquait vraiment par rapport à l'implémentation WPF de Microsoft, mais c'est moins un problème pour les jeux. J'imagine que l'intégration de WPF / G avec un moteur de jeu basé sur Direct3D serait relativement simple. Suivre cette voie pourrait vous fournir un cadre d'interface utilisateur extrêmement puissant et indépendant de la résolution avec un support étendu pour la personnalisation de l'interface utilisateur.
Juste pour vous donner une idée de ce à quoi pourrait ressembler une interface de jeu basée sur WPF, voici une capture d'écran de mon projet pour animaux de compagnie: