我正在学习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
答案 0 :(得分:1)
是的,从评论中我发现了问题。您的拖放代码会反复拾取和丢弃pawn。这确实不是正确的解决方案。相反,你应该只放弃LeftMouseUp
。
你想要的是一个DragOperation
课程。在检测到拖动操作的开始时(鼠标按下pawn),可以创建它。 DragOperation
类在其构造函数中有一个sf::Sprite & pieceSelected
。您还应该存储拖动操作开始的鼠标和 pawn坐标。
在拖动时,绘制所选部分的责任应移至DragOperation
类。这允许您以像素为增量平滑地拖动pawn,而不是仅在正方形的中间绘制它。
释放鼠标按钮后,检查结果,然后删除DragOperation
对象。