SDL_MouseButtonEvent 表现得像 SDL_MouseMotion

SDL_MouseButtonEvent is behaving like SDL_MouseMotion

我编写了一个应用程序,但从 SDL 得到了错误的输出。为了说明我的问题,我开发了一个简单的代码来计算鼠标的点击次数。我在 Windows.

上使用带有 GCC 编译器的 CodeBlocks

代码如下:

#include "SDL.h"
#include <stdio.h>

int main ( int argc , char *args[] )
{
    SDL_Window *window = NULL ;
    SDL_Renderer *render = NULL ;
    SDL_Event event ;
    int counter = 0 ;

    SDL_Init ( SDL_INIT_EVERYTHING ) ;

    window = SDL_CreateWindow ( "" , 0 , 0 , 400 , 400 , SDL_WINDOW_BORDERLESS ) ;
    render = SDL_CreateRenderer ( window , -1 , SDL_RENDERER_ACCELERATED ) ;

    // Putting white color over window
    SDL_SetRenderDrawColor ( render , 255 , 255 , 255 , 255 ) ;
    SDL_RenderClear ( render ) ;
    SDL_RenderPresent ( render ) ;

    counter = 0 ; //Reinitializing counter to 0

    //Starting Input
    while ( 3 )
    {
         SDL_PollEvent ( &event ) ;
         if ( event.type == SDL_MOUSEBUTTONUP )
         {
               counter++ ;
         }
         else if ( event.type == SDL_KEYUP )
         {
               if ( event.key.keysym.sym == SDLK_ESCAPE )
               {
                     break ;
               }
         }
    }

    // Actual Clicks = 2
    printf("CLicks = %d" , counter );

    return 0 ;
}

输出总是相当大且错误。样本输出张贴在

https://drive.google.com/open?id=0B2krxxnuHys0UzB3Q1d3MzJEVVU

SDL_PollEvent 在事件发生之前不会阻塞,而是 return 如果将事件数据写入给定结构则为 1,否则为 0。您忽略了这个值并从事件中读取数据;没有人说这个事件数据是有效的,尤其是第一次,因为它甚至没有被初始化。

检查 return 值并且仅在 SDL 所述事件确实发生时才使用事件。您还可以使用 SDL_WaitEvent,它会阻塞直到事件发生。