gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:31:02 25 4
gpt4 key购买 nike

我在尝试创建一个用鼠标移动对象的脚本时遇到了问题。当我按住鼠标按钮时,对象应该移动(哪个按钮并不重要,所以让我们把它留在那里。我使用 SDL,所以我可以毫不费力地实现它)。我当然可以有一个变量 moving = true当我开始移动然后更新位置直到 moving = false ,但这似乎可能很困惑。我想要的是能够调用函数 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);
}

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

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

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

最佳答案

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

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

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

按下按钮时,将拖动状态变量归零,并处理“完成移动”逻辑。

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

这一切是不是有点乱?是的。有必要吗?是的。

关于c++ - 如何在 C++ 中用鼠标移动对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28370894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com