我现在正在学习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

最佳答案

是的,从评论中我发现了问题所在。您的拖放代码会反复拾取和放置该棋子。这确实不是正确的解决方案。相反,您应该只将片段放在LeftMouseUp上。

您想要的是一个DragOperation类。当您检测到拖动操作的开始(鼠标向下拖动到棋子上)时,就可以创建它。当然,DragOperation类在其构造函数中有一个sf::Sprite & pieceSelected集。您还应该在拖动操作开始的地方存储鼠标坐标和典当坐标。

拖动时,绘制所选零件的职责应移至DragOperation类。这样,您就可以以像素为单位平滑拖动pawn,而不必仅在正方形的中间进行绘制。

释放鼠标按钮后,检查结果,然后删除您的DragOperation对象。

09-28 08:03