2013-04-07 84 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

相關問題