我现在正在学习 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
最佳答案
是的,从评论中我发现了问题。您的拖放代码反复拾取和放下 pawn。这确实不是正确的解决方案。相反,您应该只将棋子放在 LeftMouseUp
上。
您需要的是 DragOperation
类。当您检测到拖动操作开始时(将鼠标放在 pawn 上),您就创建了它。 DragOperation
类有一个 sf::Sprite & pieceSelected
,当然是在它的构造函数中设置的。您还应该存储拖动操作开始的鼠标 和 pawn 坐标。
拖动时,绘制所选片段的责任应移至 DragOperation
类。这允许您以像素增量平滑地拖动 pawn,而不是仅将其绘制在正方形的中间。
当鼠标按钮被释放时,检查结果然后删除你的 DragOperation
对象。
关于c++ - 我怎样才能引用一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15868105/