我在尝试创建使用鼠标移动对象的脚本时遇到问题。当我按住鼠标按钮时,该对象应该移动(该按钮并不重要,所以让我们把它放在那里。我使用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);
}
除了事件队列,板和作为结构,用户定义类和用户定义类的片段之外,所有变量都是整数。
这实际上是一个设计问题,所以我不需要可执行代码。如果我应该分配pixX
和pixY
,有关如何进行设计的更多提示应该是mouseX
和mouseY
的指针,依此类推。
如果有人有想法我会很高兴。我试图尽可能好地描述问题,但如果您有任何疑问请发表评论。如果我有任何尝试,我会描述进一步的尝试,但我真的不知道从哪里开始。此外,这不是工作,或学校和我一直在考虑这几天,并没有找到一个很好的方法来做到这一点。所以我不只是想轻易逃脱。
答案 0 :(得分:2)
你对指针的看法似乎定义不明确,可能会引导你走上一条无用的道路。
当你移动一块时,你需要像往常一样使用相同的事件循环。这意味着MOUSEMOTION有时必须调整一件作品的位置,有时则不然。这意味着你需要以某种方式跟踪“移动一块”状态。
这是基本配方: 在按钮上,保存您单击的片段的idx,可能在名为“piece_being_dragged”的变量中,或者其他内容。您还需要将鼠标指针的偏移量保存到对象中心,以便对象不会在指针上重新定位。当你到达那里时,你会明白我的意思。
按下按钮,将拖动状态变量归零,并处理“完成移动”逻辑。
在mousemotion上,当piece_being_dragged为非零时,从索引中查找该部分,并根据鼠标指针和先前保存的中心偏移量设置新位置。
这有点乱吗?是。有必要吗?是。