C 为什么此代码在快速移动鼠标时跳过点?
我昨天开始学习SDL库,经过一些阅读和询问,我编写了一个非常简单的程序,当左键按下时,它会画一个块 问题是,当鼠标快速移动时,它会跳过点,因此会得到一堆正方形而不是一条线,下面的屏幕截图显示了一条线以正常速度移动鼠标,另一条线以快速移动鼠标: 是什么导致它跳过所有这些点? 代码如下:C 为什么此代码在快速移动鼠标时跳过点?,c,drawing,sdl,C,Drawing,Sdl,我昨天开始学习SDL库,经过一些阅读和询问,我编写了一个非常简单的程序,当左键按下时,它会画一个块 问题是,当鼠标快速移动时,它会跳过点,因此会得到一堆正方形而不是一条线,下面的屏幕截图显示了一条线以正常速度移动鼠标,另一条线以快速移动鼠标: 是什么导致它跳过所有这些点? 代码如下: //keep the window open while(running){ //handle events while(SDL_PollEvent(&event)){
//keep the window open
while(running){
//handle events
while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_MOUSEBUTTONDOWN:
//left button down draws black block
if(event.button.button == SDL_BUTTON_LEFT) boxColor = black;
//right button "erases" a point
else
if(event.button.button == SDL_BUTTON_RIGHT) boxColor = blue;
//middle button clears the screen
else {
clearScreen(display,blue);
break;
}
//where to draw
drawing = 1;
boxRect.x = event.button.x - BOX_WIDTH / 2;
boxRect.y = event.button.y - BOX_HEIGHT / 2;
break;
case SDL_MOUSEMOTION:
//keep drawing if the button is pressed
if(drawing == 1){
boxRect.x = event.motion.x - BOX_WIDTH / 2;
boxRect.y = event.motion.y - BOX_HEIGHT / 2;
}
break;
//stop drawing when the button is no longer pressed
case SDL_MOUSEBUTTONUP:
drawing = 0;
break;
//quit if window closing button is pressed
case SDL_QUIT:
running = 0;
break;
}
}
//draw
if(drawing == 1){
SDL_FillRect(display,&boxRect,boxColor);
SDL_Flip(display);
}
}
因为系统实际上不是以连续流的形式获取点,所以它必须轮询鼠标位置。这意味着,如果鼠标移动太快,两次投票之间的差异将大到足以产生差距。在当前位置和最后一次位置之间划一条线就是答案吗?或者有更好的解决方案?@2013Asker如果你想要一条实线,那么是的,这可能是最好的解决方案。如果块很小,比如1px,而我想要画一个圆怎么办?如何在没有间隙的情况下允许这样做?@2013Asker其他绘制程序通过将按下鼠标按钮的点作为圆的中心,并将当前鼠标位置(按下按钮时)作为半径来解决此问题。画一个圆很简单,我是说徒手画。我认为在两个点之间画一条线会使圆比根据精确的鼠标轨迹逐点画的圆更方。我会试着把这些点连起来,然后贴一个更具体的问题。谢谢你的回复。