如何在 C++ 中用鼠标移动对象?

How to move an object with the mouse in c++?

我在尝试创建用鼠标移动对象的脚本时遇到问题。当我按住鼠标按钮时,对象应该移动(哪个按钮并不重要,所以让我们把它留在那里。我使用 SDL,所以我可以毫不费力地实现它)。当我开始移动然后更新位置直到 moving = false 时,我当然可以有一个变量 moving = true,但这似乎可能很混乱。我想要的是能够调用一个函数 grab_piece 然后让棋子跟随鼠标直到我调用释放函数(我正在创建一个国际象棋游戏,棋子从哪里来)。

到目前为止的想法和相关代码:想法是为鼠标 x 和 y 位置分配一个指针,这当然会同时移动棋子时间如老鼠。然而,这似乎很乏味,因为围绕指针移动似乎很容易出错。有可能以安全的方式做到这一点吗?否则我愿意接受其他建议。

示例代码

SDL_Event e; //Event queue more or less
while (!quit) //Main loop, a little simplified

while (SDL_PollEvent( &e ) != 0){
    if (e.type == SDL_QUIT){
        quit = true;
    }

    if(e.type == SDL_MOUSEMOTION){
        SDL_GetMouseState(&mouseX, &mouseY);
        //do irrelevant things
    } else if (e.type == SDL_MOUSEBUTTONDOWN){
        //get mouse position
        SDL_GetMouseState(&mouseX, &mouseY);
        //get the board position
        mouseBinPos = misc::screen2idx(mouseX, mouseY);
        //location in the piece vector (hard coded)
        currentPieceIdx = chess_board.getMappedPiece(mouseBinPos);
        if (currentPieceIdx>=0){
            chess_board.getPiece(currentPieceIdx)->grab_piece(mouseX, mouseY);
        }
    } else if ((e.type == SDL_MOUSEBUTTONUP)) {
        //will release the piece and snap to nearest bin. Not implemented yet.
        snap2bin(in args);
    }
}

}

void Piece::grab_piece(int mouseX, int mouseY){
    //Set pixel positions
    setPixX(mouseX);
    setPixY(mouseY);
}

所有变量都是整数,除了事件队列,棋盘和棋子是一个结构,用户定义class和用户定义class。

这其实更多的是设计问题,所以我不需要可执行代码。关于如何进行设计的更多提示,如果我应该分配 pixXpixY 应该指向 mouseXmouseY 等等。

如果有人有想法,我会很高兴。我已尝试尽可能详细地描述问题,但如果您有任何问题,请发表评论。如果有的话,我会描述进一步的尝试,但我真的不知道从哪里开始。另外,这不是工作,也不是学校,我已经考虑了好几天了,但没有找到一个好的方法。所以我不是想轻易逃走。

您关于指针的想法似乎不明确,并且可能将您引向一条无用的道路。

移动棋子时,您需要像往常一样使用相同的事件循环。这意味着 MOUSEMOTION 有时必须调整棋子的位置,有时则不需要。这意味着您需要以某种方式跟踪 "moving a piece" 状态。

基本配方如下: 在按下按钮时,保存你点击的片段的 idx,可能在一个名为 "piece_being_dragged" 的变量中,或者其他什么。您还需要保存鼠标指针到对象中心的偏移量,这样对象就不会在指针上重新居中。当你到达那里时你会明白我的意思。

按下按钮时,将拖动状态变量归零,并处理 "done moving" 逻辑。

在mousemotion上,当piece_being_dragged非零时,从索引向上查找棋子,并根据鼠标指针和先前保存的中心偏移设置新位置。

是不是有点乱?是的。有必要吗?是的