C++ 命令模式:如何执行连续操作?(例如,移动物体)

C++ 命令模式:如何执行连续操作?(例如,移动物体),c++,command-pattern,C++,Command Pattern,假设我正在制作一个程序,用户可以在其中绘制并移动形状移动命令则可以如下所示: class MoveCommand { public: MoveCommand(Shape& shape, const Vector2f& offset) : shape(shape), offset(offset) { } void execute() { shape.move(offset); } void und

假设我正在制作一个程序,用户可以在其中绘制并移动形状<代码>移动命令则可以如下所示:

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;
};
这很好,但如何显示移动预览(当用户按住鼠标按钮时),然后仅在释放鼠标按钮时存储最终偏移

是否应
ShapeEditor
类移动形状,然后在按钮释放时创建
MoveCommand
?如果
execute()
的代码不是微不足道的呢?如何避免
ShapeEditor
MoveCommand
中的代码重复

这很好,但如何显示移动预览(当用户按住鼠标按钮时),然后仅在释放鼠标按钮时存储最终偏移

如果我理解正确的话,您希望将整个运动作为一个单独的操作来执行/重新执行,同时在第一次以交互方式完成每个单独的微运动时设置动画

一种方法是根据您自己的建议,即仅在移动完成时记录undo/redo命令。正如您所指出的,这会导致一些代码重复。在实践中,这不是问题,因为您总是可以将常见代码分解出来


另一种方法是为每个微移动创建一个MoveCommand,然后作为撤消/重做堆栈的一部分实现命令合并。看看怎么样。

嗨,我认识你,你自上而下写了一个游戏4年左右?里面有个编辑哈哈!XD………形状移动(-offset);这真的有效吗?你们并没有得到和前一帧完全相同的偏移量。@LorenceHernandez是的,是我假设你的物体在(20,30),偏移量是(10,20)。移动对象后,其新位置为(30,50)。如果我现在移动它(-10,-20),我会得到(20,30)-它在命令执行之前的位置。好的,我以为你在使用增量时间,得到0.424,0.399,0.524。。因此,有了这些价值观,撤销将是不完美的。有一本叫《游戏编程模式》的书,我认为它很好地解释了命令模式?因为我还没看完,你介意给我一些我可以联系你的东西吗?可能是skype或任何messenger应用程序或任何东西,我只想问一些关于我将在大学项目中工作的游戏的事情谢谢。@LorenceHernandez,给我写封电子邮件:eliasdaler@yandex.ruThank你,那正是我要找的。