2017-02-15 40 views
-2

Я закодировал приложение, но получил ошибочные выходы из SDL. Чтобы указать мою проблему, я разработал простой код для подсчета количества кликов мышью. Я использую CodeBlocks с компилятором GCC в Windows.SDL_MouseButtonEvent ведет себя как SDL_MouseMotion

Код выглядит следующим образом:

#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

+1

Удалите ли вы ссылку на Google Drive и переместите вывод в вопрос? Поскольку вопрос зависит от этой ссылки, мы не хотим рисковать удалением данных, поскольку это означает, что нам нужно будет удалить вопрос. Помните, что вопросы здесь предназначены для потомков, а не только для оригинального плаката. – halfer

+1

Просьба также прочитать: [При каких обстоятельствах я могу добавить «срочные» или другие подобные фразы к моему вопросу, чтобы получить более быстрые ответы?] (Http://meta.stackoverflow.com/q/326569/472495). – halfer

ответ

1

SDL_PollEvent не блокирует, пока событие не произойдет, но вместо этого возвращает 1, если записанные данные события в данную структуру, или 0, в противном случае. Вы игнорируете это значение и в любом случае читаете данные из события; никто не сказал, что данные этого события действительны, особенно в первый раз, поскольку он даже не был инициализирован.

Проверьте возвращаемое значение и используйте событие только в том случае, если SDL сказал, что событие действительно произошло. Вы также можете использовать SDL_WaitEvent, который блокируется до тех пор, пока не произойдет событие.

+0

Не могли бы вы продумать пример? –

+0

Я знаю, что это было бы утомительно, но, пожалуйста, –

+0

Я, наконец, повесил то, что вы хотели сказать, приятель. Большое спасибо. Проект включен !!! В любом случае, для других пользователей, поместите 'if (! (SDL_PollEvent (& event)) continue:' in while loop в начале & см. Чудеса. Удалите нормальный 'SDL_PollEvent (& event) '. Еще раз спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^