我怎么能参考一个函数?

时间:2013-04-07 21:34:21

标签: c++ function reference sfml

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

1 个答案:

答案 0 :(得分:1)

是的,从评论中我发现了问题。您的拖放代码会反复拾取和丢弃pawn。这确实不是正确的解决方案。相反,你应该只放弃LeftMouseUp

你想要的是一个DragOperation课程。在检测到拖动操作的开始时(鼠标按下pawn),可以创建它。 DragOperation类在其构造函数中有一个sf::Sprite & pieceSelected。您还应该存储拖动操作开始的鼠标 pawn坐标。

在拖动时,绘制所选部分的责任应移至DragOperation类。这允许您以像素为增量平滑地拖动pawn,而不是仅在正方形的中间绘制它。

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