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
?
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. –
@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. –
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 –