c - 为什么这段代码在快速移动鼠标时会跳过点?

标签 c drawing sdl

我昨天开始学习SDL库,经过一些阅读和询问后,制作了一个非常简单的程序,当左键按下时绘制一个 block 。

问题在于,当鼠标快速移动时,它会跳过点,因此您得到的是一堆方 block 而不是一条线,下面的屏幕截图显示了以常规速度移动鼠标的一条线和快速移动鼠标时的一条线:

enter image description here

是什么导致它跳过所有这些点?

代码如下:

//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);
    }
}

最佳答案

因为系统实际上并没有以连续流的形式获取点,所以它必须轮询鼠标位置。这意味着如果您移动鼠标太快,两次民意调查之间的差异将足够大,从而产生差距。

关于c - 为什么这段代码在快速移动鼠标时会跳过点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18146276/

相关文章:

c++ - Eclipse 中没有出现 SDL 窗口

c++ - 交叉编译程序找不到 SDL2 header

c - scanf 后 fgets 不起作用

c - 给定一个指向结构中成员 a 的指针,编写一个返回指向该结构的指针的例程

c# - 在Graphics.Drawing中使用未分配的局部变量

ios - 在drawInRect中绘制渐变层

c - 将当前时间更新一秒的程序

c++ - Visual Studio 2010 C++ 编译器 - 编译时获取当前行号

android - 不渲染转换后的路径

c - 'busy-wait'无限循环和条件验证无限循环的区别