2013-04-07 87 views
0

我正在学习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' 来,这样,当我移动“pieceSelected被引用 '典当' “我实际上是在同时移动”典当“。

EDIT

我固定这通过改变

sf:Sprite pieceSelected; 

sf::Sprite * pieceSelected; 

pieceSelected.SetPosition 

pieceSelected->SetPosition 
+1

你可能会想要一个指针,看看你如何改变棋子,有时候根本没有棋子。 – chris 2013-04-07 21:37:26

+0

'sf ::雪碧典当; sf :: Sprite&pieceSelected = Pawn;' – lapk 2013-04-07 21:37:41

+0

'if(LeftButtonDown && selected)'的'else'部分不是必需的。 – didierc 2013-04-07 21:47:29

回答

1

正确的,从我发现的问题的意见。你的拖放代码反复拾取并丢弃典当。这确实不是正确的解决方案。相反,你只应该把它放在LeftMouseUp上。

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

拖动时,绘制所选作品的责任应移至DragOperation类。这可以让你平滑地拖动棋子,以像素为增量,而不是只在正方形中间画。

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

+0

啊,这很聪明。我用bool'selected'补偿了下降部分,但这是一种更好的方法。谢谢! – PearSquirrel 2013-04-08 00:02:35

相关问题