【发布时间】:2018-04-17 05:48:04
【问题描述】:
我有一个想要移动的对象。我希望它只有在我单击时才移动,然后将鼠标拖到一个地方,然后在释放时,它开始向它移动。因此,如果我在其中单击,我可以在按住鼠标按钮的同时将鼠标移动到任何地方,但只有当我松开鼠标时它才会开始移动。
目前,我能做的最好的事情就是让对象跟随(顺便说一句,落后几秒钟,而不是在鼠标位置上),只要我按住鼠标按钮并移动它。从哪里开始点击并不重要,只要我点击并移动,只要我按住鼠标按钮,对象就会向它移动。任何其他尝试都会使对象保持静止/根本不移动。
void mousemotion(int x, int yc){
globals.mouse_x = x;
globals.mouse_y = HEIGHT - yc;
}
和
int main(int argc, char** argv){
glutInit(&argc, argv);
....
//glutMouseFunc(processMouse);
glutMotionFunc(mousemotion);
是当前用于允许上述结果的唯一鼠标函数/回调。我尝试过添加glutMouseFunc 回调,但更改其中的state 参数会产生不好的结果。例如:
//glutMouseFunc callback
void processMouse(int button, int state, int x, int yc){
if ( state == GLUT_UP){
globals.centre_x = globals.mouse_x;
globals.centre_y = globals.mouse_y;
}
GLUT_DOWN 不会改变主要行为,但是当对象处于运动状态时,我只需单击一次,对象就会捕捉到它要去的位置。 GLUT_UP 就是这样做的,所以一旦我释放鼠标,对象就会立即捕捉到它要去的位置。这些行为对于他们的行为方式是有意义的,但我无法操纵它以我想要的方式工作。我还做了一个函数来检查一个点是否在对象内部,但我不知道它适用于哪里
bool inside(int x, int y){
if(x >= globals.centre_x - 20
&& x <= globals.centre_x +20
&& y >= globals.centre_y - 20
&& y <= globals.centre_y+ 20){
return true;
}
else
return false;
}
它可能会在鼠标函数中使用一次,使用 x 和 y 鼠标坐标作为参数。
我在网上看到的所有拖放示例都涉及立即拖动对象,即单击对象并且对象在您移动时遵循确切的 x,y 鼠标坐标,但我只想在我让鼠标离开,物体就会开始移动。
任何帮助表示赞赏。让我知道我是否可以澄清任何事情。谢谢
【问题讨论】:
-
您的问题到底是什么? 1.您不知道如何识别鼠标按下(单击)/鼠标移动/鼠标向上(释放)事件? 2.你不知道如何插值/动画路径?这与您之前的@987654321@ 问题有何不同?除此之外,这里有更好的描述,还有代码
-
@Spektre 第一个
-
看看我的解决方案(我直接写在这里,所以它们可能是拼写错误)。我不使用 GLUT,所以它未经测试但应该可以工作......