2017-02-26 2 views
0

Supposons que je crée un programme dans lequel l'utilisateur peut dessiner puis déplacer des formes. MoveCommand peut alors ressembler à ceci:Motif de commande: comment puis-je effectuer des actions continues? (par exemple, déplacement d'un objet)

class MoveCommand { 
public: 
    MoveCommand(Shape& shape, const Vector2f& offset) : 
      shape(shape), offset(offset) 
    { } 

    void execute() { 
     shape.move(offset); 
    } 

    void undo() { 
     shape.move(-offset); 
    } 
private: 
    Shape& shape; 
    Vector2f offset; 
}; 

Cela fonctionne bien, mais comment puis-je afficher des aperçus de mouvement (lorsque l'utilisateur tient le bouton de la souris), puis seul magasin décalage final sur la libération du bouton de la souris?

La classe ShapeEditor doit-elle déplacer la forme et créer MoveCommand à la libération du bouton? Que faire si le code de execute() n'est pas trivial? Comment puis-je éviter la duplication de code dans ShapeEditor et MoveCommand?

+0

salut, je vous connais, vous écrivez une descente de jeu pour 4 ans ou plus? avec un éditeur dedans lol! XD ............. shape.move (-offset); cela fonctionnera-t-il vraiment? vous n'obtenez pas exactement le même décalage par rapport à l'image précédente. –

+0

@LorenceHernandez ouais, c'est moi! : D Supposons que votre objet soit (20, 30) et que son décalage soit (10, 20). Après avoir déplacé l'objet, sa nouvelle position est (30, 50). Si je le déplace par (-10, -20) maintenant, j'obtiendrai (20,30) - la position où il se trouvait avant l'exécution de la commande. –

+0

okay je pensais que vous utilisiez delta temps et obtenir comme 0.424, 0.399, 0.524 .. donc avec ces valeurs annuler sera imparfait. theres un livre appelé modèles de programmation de jeu, il explique très bien le modèle de commande, je pense? parce que je n'ai pas fini de le lire –

Répondre

2

Cela fonctionne bien, mais comment puis-je afficher l'aperçu du mouvement (lorsque l'utilisateur appuie sur le bouton de la souris), puis seulement stocker le décalage final sur le bouton de la souris?

Si je vous comprends bien, vous voulez faire tout le mouvement non faisables/re-faisables en une seule opération, tout en animant chaque micro-mouvement individuel quand il est fait de manière interactive la première fois.

Une façon de le faire est ce que vous proposez vous-même, c'est-à-dire enregistrer la commande annuler/refaire uniquement lorsque le mouvement est terminé. Comme vous le faites remarquer, cela conduit à une duplication du code. En pratique, ce n'est pas un problème, car vous pouvez toujours prendre en compte ce code commun.

Une autre méthode consiste à créer une MoveCommand pour chaque micro-mouvement, puis à implémenter la fusion de commandes dans votre pile d'annulation/rétablissement. Voir comment c'est done in Qt.

+0

Merci, c'est exactement ce que je cherchais. –