FANDOM


Ceci est une débauche, que je finirai un peu plus tard — Égru

L’éditeur de Saphira intègre un mécanisme pour gérer le couple défaire/refaire (undo/redo), cependant celui-ci ne peut être automatique ; il demande un effort collaboratif du développeur. Chaque action devant être réversible doit hérité de la classe de base virtuelle pure Action, celle-ci définit une interface commune à toutes les actions ainsi que quelques facilités ; la seule méthode devant être obligatoirement implémenté par la classe dérivée est std::string Action::getDescription() qui retourne une description succinte de l’action. Pour utiliser une action, il suffit d’utiliser un code du genre : ActionManagerInstance.setCurrentAction(new DoSomething( args…));

À chaque carte est associé une instance de ActionManager qui gère une pile d’action réalisée ainsi que l’action en cours. ActionManagerInstance est l’instance de la carte courante, c’est à dire celle qui est affiché dans l’éditeur.

Initialisation d’une actionModifier

La vie d’une action peut être décomposé en 3 phases : La première est l’initialisation de l’action, celle-ci ce fait dans le constructeur de l’action. La seconde est la création de l’action, celle-ci commence dans le constructeur ou pendant l’appel de la fonction void registered() ; cette seconde étape à une durée variable, il s’agit du temps pendant lequel l’action n’est pas terminé, par exemple l’utilisateur est en train de bouger un objet. La troisième, commence par l’appel de la fonction void ActionManager::endCurrentAction() par l’action — par exemple quand l’utilisateur a finit de bouger un objet, l’action ne peut alors plus être modifié, mais elle est insérée dans la pile des actions et peut ainsi être défaite ou refaite.

Faire/Défaire une actionModifier

Chaque action doit pouvoir être réaliser puis être défaite. La classe Action déclare quelques fonctions de base pour contrôler une action ainsi que quelques aides et chaque action doit dériver de la classe Action. Lorsque le programmeur souhaite créer une action réversible, plusieurs méthode se pose à lui :

  • créer le code permettant de faire/défaire une action
  • spécifier la liste des objets modifiés/ajouté/supprimer
  • donner une liste d’action à faire
  • mélanger les trois méthodes ci-dessus

Examinons ces différentes techniques :

Créer le code permettant de faire/défaire une actionModifier

Il suffit d’implémenter la fonction void restoreObjectState(), celle-ci est automatiquement appelé pour défaire/refaire une action, il est possible de savoir l’état de l’action au moment de l’appel en testant Action::isUndo, si isUndo == true, restoreObjectState doit défaire l’action, sinon, il doit la refaire.

Spécifier la liste des objets modifiés/ajouté/supprimerModifier

Cette méthode plus simple que la précédente consiste à indiquer à la classe de base Action quels sont les objets créé/modifié/supprimé pendant la phase d’initialisation de l’objet. La classe Action pourra ainsi automatiser le processus pour vous. Si cette méthode est efficace pour des objets simples, elle peut s’avérer très lourde si celle-ci sont plus complexes et ignorera les listes d’objets — pour lesquels on utilisera avantageusement la troisième méthode.

Donner une liste d’action à faireModifier

Cette méthode ressemble à la première excepté que tout le travail ce passe à l’initialisation. La classe dérivé de Action y constitue une liste d’actions sous forme de foncteur via la bibliothèque Boost::Lambda et les foncteur fournit à coté de la classe Action. Il est possible ainsi de ne stocker qu’un membre donné d’un objet avec le foncteur ObjectMemberSaver, ou de spécifier les action pour défaire ou refaire une action avec le foncteur UndoRedo.

Interférence d'un bloqueur de publicité détectée !


Wikia est un site gratuit qui compte sur les revenus de la publicité. L'expérience des lecteurs utilisant des bloqueurs de publicité est différente

Wikia n'est pas accessible si vous avez fait d'autres modifications. Supprimez les règles personnalisées de votre bloqueur de publicité, et la page se chargera comme prévu.