0

私は現在、C++ と SFML を学んでおり、盤上で駒をドラッグ アンド ドロップできるチェス プログラムを作成しようとしています。マウスの左ボタンが押されているかどうか、マウスがピースの上にあるかどうかを確認して、ピースをドラッグします。これらが両方とも当てはまる場合、ピースの位置をマウスの位置に変更します。

唯一の問題は、ピースを非常に速くドラッグして、マウスを下に置いてもピースの上にカーソルを合わせていないことです。

次のようなものを使用してこれを修正したい:

sf::Sprite pieceSelected;
sf::Sprite Pawn;
bool selected;

...

if (LeftButtonDown && isMouseOver(Pawn,Input)) {
        pieceSelected=&Pawn;
        selected = true;
    }

    if (LeftButtonDown && selected)
        pieceSelected.SetPosition(MouseX - (XSizeSprite / 2), MouseY - (YSizeSprite / 2)); 
    else
        selected=false;

    App.Draw(Pawn);

「pieceSelected」が「Pawn」を参照するようにしたいので、「pieceSelected」を移動しているときに実際に「Pawn」を同時に移動しています。

編集

これを変更して修正しました

sf:Sprite pieceSelected;

sf::Sprite * pieceSelected;

pieceSelected.SetPosition

pieceSelected->SetPosition
4

1 に答える 1

1

そうです、コメントから私は問題を見つけました。ドラッグ アンド ドロップ コードは、ポーンのピックアップとドロップを繰り返します。それは確かに正しい解決策ではありません。代わりに、ピースを にのみドロップする必要がありますLeftMouseUp

あなたが望むのはDragOperationクラスです。ドラッグ操作の開始 (マウスをポーンの上に置く) を検出すると、それを作成します。DragOperationクラスのsf::Sprite & pieceSelectedコンストラクターには、もちろんセットがあります。また、ドラッグ操作が開始されたマウスとポーンの両方の座標も保存する必要があります。

ドラッグ中は、選択したピースを描画する責任をDragOperationクラスに移す必要があります。これにより、ポーンを正方形の中央だけに描画するのではなく、ピクセル単位でスムーズにドラッグできます。

マウス ボタンが離されたら、結果を確認してから、DragOperationオブジェクトを削除します。

于 2013-04-07T23:43:56.100 に答える