如何在 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。
这其实更多的是设计问题,所以我不需要可执行代码。关于如何进行设计的更多提示,如果我应该分配 pixX
和 pixY
应该指向 mouseX
和 mouseY
等等。
如果有人有想法,我会很高兴。我已尝试尽可能详细地描述问题,但如果您有任何问题,请发表评论。如果有的话,我会描述进一步的尝试,但我真的不知道从哪里开始。另外,这不是工作,也不是学校,我已经考虑了好几天了,但没有找到一个好的方法。所以我不是想轻易逃走。
您关于指针的想法似乎不明确,并且可能将您引向一条无用的道路。
移动棋子时,您需要像往常一样使用相同的事件循环。这意味着 MOUSEMOTION 有时必须调整棋子的位置,有时则不需要。这意味着您需要以某种方式跟踪 "moving a piece" 状态。
基本配方如下:
在按下按钮时,保存你点击的片段的 idx,可能在一个名为 "piece_being_dragged" 的变量中,或者其他什么。您还需要保存鼠标指针到对象中心的偏移量,这样对象就不会在指针上重新居中。当你到达那里时你会明白我的意思。
按下按钮时,将拖动状态变量归零,并处理 "done moving" 逻辑。
在mousemotion上,当piece_being_dragged非零时,从索引向上查找棋子,并根据鼠标指针和先前保存的中心偏移设置新位置。
是不是有点乱?是的。有必要吗?是的
我在尝试创建用鼠标移动对象的脚本时遇到问题。当我按住鼠标按钮时,对象应该移动(哪个按钮并不重要,所以让我们把它留在那里。我使用 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。
这其实更多的是设计问题,所以我不需要可执行代码。关于如何进行设计的更多提示,如果我应该分配 pixX
和 pixY
应该指向 mouseX
和 mouseY
等等。
如果有人有想法,我会很高兴。我已尝试尽可能详细地描述问题,但如果您有任何问题,请发表评论。如果有的话,我会描述进一步的尝试,但我真的不知道从哪里开始。另外,这不是工作,也不是学校,我已经考虑了好几天了,但没有找到一个好的方法。所以我不是想轻易逃走。
您关于指针的想法似乎不明确,并且可能将您引向一条无用的道路。
移动棋子时,您需要像往常一样使用相同的事件循环。这意味着 MOUSEMOTION 有时必须调整棋子的位置,有时则不需要。这意味着您需要以某种方式跟踪 "moving a piece" 状态。
基本配方如下: 在按下按钮时,保存你点击的片段的 idx,可能在一个名为 "piece_being_dragged" 的变量中,或者其他什么。您还需要保存鼠标指针到对象中心的偏移量,这样对象就不会在指针上重新居中。当你到达那里时你会明白我的意思。
按下按钮时,将拖动状态变量归零,并处理 "done moving" 逻辑。
在mousemotion上,当piece_being_dragged非零时,从索引向上查找棋子,并根据鼠标指针和先前保存的中心偏移设置新位置。
是不是有点乱?是的。有必要吗?是的