2017-02-26 5 views
0

私は、ユーザーが図形を描画して移動できる場所にプログラムを作っているとします。コマンドパターン:どのようにして連続的な操作を行うことができますか? (例えば、オブジェクトを動かす)

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; 
}; 

これはうまく動作しますが、(ユーザーがマウスボタンを保持している場合)どのように私は運動のプレビューを表示することができ、その後、マウスボタンのリリースにオフセットのみ店舗決勝:MoveCommandは、このような何かを見ることができますか?

ShapeEditorクラスはシェイプを移動し、ボタンを離したときにMoveCommandを作成する必要がありますか?​​のコードが簡単ではない場合はどうなりますか? ShapeEditorMoveCommandでコードの重複を避けるにはどうすればよいですか?

+0

こんにちは、あなたは4年ほどゲームトップダウンを書いていますか?それの中のエディターで笑って! XD ............. shape.move(-offset);これは本当に効果がありますか?前のフレームと全く同じオフセットを得ることはできません。 –

+0

@LorenceHernandezええ、それは私です! :D オブジェクトが(20,30)にあり、オフセットが(10,20)であるとします。オブジェクトを移動した後、新しい位置は(30、50)です。 (-10、-20)で移動すると、コマンド実行前の位置になります(20,30)。 –

+0

大丈夫です。あなたがデルタ時間を使っていて、0.424,0.399,0.524のようになったと思っていました。これらの値では、元に戻すことは不完全です。 theresはゲームプログラミングパターンと呼ばれる本は非常によく私は思うコマンドパターンを説明する?私はそれを読んで終わったので、私はhavent –

答えて

2

これはうまくいきますが、ユーザーがマウスボタンを押したときの動きのプレビューを表示して、マウスボタンのリリースで最後のオフセットのみを保存するにはどうすればよいですか?

私が正しくあなたを理解していれば、あなたはそれが対話的に最初の時間を行うの際に、個々のマイクロ動きをアニメーション化しながら、単一の操作として全体の動き非なんとか/再なんとかを作りたいです。

これを行う1つの方法は、移動が完了したときにのみ元に戻す/やり直しコマンドを記録することです。あなたが指摘しているように、それはコードの重複につながります。実際には問題はありません。いつも共通のコードを取り除くことができます。

もう1つの方法は、すべての微小移動に対してMoveCommandを作成してから、元に戻す/やり直しスタックの一部としてコマンドマージを実装することです。それがどうですか?done in Qtを見てください。

+0

ありがとう、それはまさに私が探していたものです。 –

関連する問題