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