如何用c ++中的鼠标移动对象?

时间:2015-02-06 16:59:22

标签: c++ c mouseevent sdl

我在尝试创建使用鼠标移动对象的脚本时遇到问题。当我按住鼠标按钮时,该对象应该移动(该按钮并不重要,所以让我们把它放在那里。我使用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,有关如何进行设计的更多提示应该是mouseXmouseY的指针,依此类推。

如果有人有想法我会很高兴。我试图尽可能好地描述问题,但如果您有任何疑问请发表评论。如果我有任何尝试,我会描述进一步的尝试,但我真的不知道从哪里开始。此外,这不是工作,或学校和我一直在考虑这几天,并没有找到一个很好的方法来做到这一点。所以我不只是想轻易逃脱。

1 个答案:

答案 0 :(得分:2)

你对指针的看法似乎定义不明确,可能会引导你走上一条无用的道路。

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

这是基本配方: 在按钮上,保存您单击的片段的idx,可能在名为“piece_being_dragged”的变量中,或者其他内容。您还需要将鼠标指针的偏移量保存到对象中心,以便对象不会在指针上重新定位。当你到达那里时,你会明白我的意思。

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

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

这有点乱吗?是。有必要吗?是。